我是Java EE的新手,我遇到了下面描述的问题,如果你能帮助我,我会很高兴。
我需要在服务器上实现一些逻辑(基于有限状态机)。据我所知,我应该将它实现为EJB,对吧?问题是一个客户端应该能够创建这样的“对象”,而其他客户端应该能够连接到它。当所有客户端断开表单对象时,它应该被销毁。
此外,此类对象在循环中执行某些操作,并且必须能够通知连接的客户端特定的更改。
到目前为止,我了解到EJB面向单用户会话或基于消息的通信。它们都不符合我的要求。
任何提示如何为我的问题设计应用程序?我应该坚持使用Java EE 6。
答案 0 :(得分:2)
正如@André建议的那样,具有有限状态机的对象应该是@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
类,只要客户端会话有效,它就会存在。在session-scoped类的初始请求中,将自己注册到单例。然后,您可以通过循环遍历列表来通知客户有关事件的信息。无论何时需要最新数据,都可以通过请求查询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() {}
}
请注意,您无法从Event<>
向@ApplicationScoped
对象发送CDI @SessionScoped
,因为它们的上下文在应用程序上下文中不可用。
答案 1 :(得分:1)
您可以尝试在此处使用JMS javax.jms.Topic
,其中一个客户可以发布消息&amp;其他人可以听听。
因此,无论何时添加新消息,都会通知该特定主题的所有订阅客户端。
答案 2 :(得分:0)
尝试让你的“对象”成为一个单独的ejb触发事件给你的连接客户端 - cdi观察者。