5

我有一个 Java EE 应用程序,其中模型从各种来源非常频繁地更新。此外,我有一个富客户端应用程序,它通过远程 EJB 触发一些操作,但它还应该显示至少每秒吃一次的模型更改。

将更改从 Java EE 应用程序发送到 Java 客户端应用程序的最简单/最佳选择是什么?到目前为止,我有以下选择:

  1. 每秒从客户端轮询远程 EJB
  2. 轮询 servlet(是否最好使用 json/xml 而不是 java 对象序列化?还有其他序列化吗?)
  3. websockets (是否可以在这里发送 Java 对象?或者例如必须将结果序列化为 Json?)
  4. tcp 套接字连接(服务器将提供一个端口,客户端在启动时连接到该端口。模型更改通过标准对象序列化发送。这在 Java EE 应用程序中是否“允许”?)
4

1 回答 1

3

选项 1是最简单的,您可以使用异步 EJB 方法:

服务器

@Asynchronous
public Future<String> getUpdatedModel() {
    //here create blocking process until something interesting happen
    return new AsyncResult<String>("model has changed!");
}

客户

    Future<String> updatedModel = bean.getUpdatedModel();
        while(true){
            String response = updatedModel.get();
            //process response here
        }

选项 2看起来像选项 1,但您必须处理封送对象,所以不要费心使用普通的 servlet。

选项 3看起来很有趣,因为 Websocket 将包含在 Java EE7 中(现在您可以将开源彗星实现用于 servlet)。在我看来,它不是为企业应用程序中的通信而设计的,但可能适合您的用例。有很多可用的 JSON 序列化程序(例如 gson),我使用 JS 和 java 之间的那种通信,并且工作正常。

选项 4违反了主要的 Java EE 原则(禁止打开自己的套接字),我不鼓励您使用它。

选项 5听谢并使用 JMS!如果您将使用 JMS 主题,您可以在特定事件发生时发送消息,所有连接的客户端将异步接收消息。解决此类问题的自然 Java EE 方式是开箱即用的事务、消息重新传递和必要时的持久性。

于 2013-06-30T22:55:16.260 回答