单个EJB负责逻辑和许多客户端

时间:2012-03-08 12:15:18

标签: java-ee java-ee-6 ejb-3.1

我是Java EE的新手,我遇到了下面描述的问题,如果你能帮助我,我会很高兴。

我需要在服务器上实现一些逻辑(基于有限状态机)。据我所知,我应该将它实现为EJB,对吧?问题是一个客户端应该能够创建这样的“对象”,而其他客户端应该能够连接到它。当所有客户端断开表单对象时,它应该被销毁。

此外,此类对象在循环中执行某些操作,并且必须能够通知连接的客户端特定的更改。

到目前为止,我了解到EJB面向单用户会话或基于消息的通信。它们都不符合我的要求。

任何提示如何为我的问题设计应用程序?我应该坚持使用Java EE 6。

3 个答案:

答案 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观察者。