如何从Java EE应用程序发送事件(推送通知)?

Lei*_*ngo 5 events client-server java-ee

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

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

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

isk*_*mac 3

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

服务器

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

客户

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

选项 2看起来与选项 1 类似,但您必须处理编组对象,因此不必费心使用普通 servlet。

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

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

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