2012-03-08 21 views
1

我是Java EE的新手,我遇到了下面描述的問題,如果你能幫助我,我會非常高興。單個EJB負責邏輯和許多客戶端

我需要在服務器上實現一些邏輯(基於有限狀態機)。據我瞭解,我應該把它實現爲EJB,對吧?問題是一個客戶端應該能夠創建這樣的「對象」,其他客戶端應該能夠連接到它。當所有的客戶端斷開對象時,它應該被銷燬。

此外,這樣的對象在循環中執行一些操作,它必須能夠通知連接的客戶端特定的變化。

到目前爲止,我瞭解到EJB是面向單用戶會話或基於消息的通信。它們都不符合我的要求。

任何提示如何爲我的問題設計應用程序?我應該堅持使用Java EE 6.

回答

0

試着讓你的「對象」單身ejb將事件發送給你的連接客戶端 - cdi觀察者。

1

您可以嘗試在此處使用JMS javax.jms.Topic,其中您的一位客戶可以發佈消息&其他人可以收聽它。

因此,每當添加新消息時,該特定主題的所有訂閱客戶端都會收到通知。

2

正如@安德烈表明,與有限狀態機的對象應該是一個@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<>,因爲他們的背景是不是在應用程序上下文中可用。