正如@安德烈表明,與有限狀態機的對象應該是一個@ApplicationScoped
類或@Singleton
這取決於你是否需要EJB功能與否,客戶端可以進行註冊:
@ApplicationScoped
public class StateMachine {
private List<Client> clients;
@PostConstruct
public void create() {
clients = new LinkedList<Client>();
}
public void register(Client client) {
clients.add(client);
}
public void unregister(Client client) {
clients.remove(client);
if (clients.isEmpty()) {
reset();
}
}
public void reset() {
// resets the singleton, because the container manages its life-cycle
}
}
的Client
類可以是一個@SessionScoped
分類,只要客戶端會話有效就會生活。在會話範圍的類的初始請求上註冊到單例。然後,您可以通過在列表中循環來通知客戶有關事件。無論何時需要最新的數據,Client
類可以通過請求查詢。
@SessionScoped
public class Client {
@Inject private StateMachine machine;
@PostConstruct
public void registerToStateMachine() {
machine.register(this);
}
@PreDestroy
public void unregisterFromStateMachine() {
machine.unregister(this);
}
public void handleEvent(/*..*/) {}
public /*..*/ query() {}
}
要知道,你不能從@ApplicationScoped
到@SessionScoped
對象發送CDI Event<>
,因爲他們的背景是不是在應用程序上下文中可用。