我已经浏览了很多Web Socket示例、演示文稿,它们大多集中在一个相当简单的场景中,即客户端启动客户端-服务器通信。
我对另一种场景感兴趣,这种场景似乎同样实用:纯服务器向客户端推送。
我心目中的一个例子是更新网站上股票价值的应用程序。想象一下,有一个外部系统股票交易系统,它为每个订阅的股票价值变化发送一个JMS消息。
我想知道如何将这样的JMS事件转换为服务器推送,并从Java EE 7的角度高效、惯用地执行。
就我所理解的规范而言,我应该编写一个Web Socket端点。
@ServerEndpoint("/demo")
public class WSEndpoint {
private static final Logger LOG = Logger.getLogger(WSEndpoint.class);
@OnMessage
public void onMessage(String message, Session session) {
LOG.info("Received : " + message + ", session:" + session.getId());
}
@OnOpen
public void open(Session session) {
LOG.info("Open session:" + session.getId());
}
@OnClose
public void close(Session session, CloseReason c) {
log.info("Close session:" + session.getId());
}
}
当我从前端收到一条消息时,@OnMessage
方法能让我随心所欲地处理。但在我的例子中,我将不会从客户端收到任何消息,而是从某个外部系统接收事件。
有几种方法可供选择。例如,在 @OnOpen
方法中创建一个线程,就像这篇博客中演示的那样。实践中,该方法可能存在缺陷,因为对于每个客户端,我都需要创建一个新的、潜在的长期运行的线程。
使用NIO通道和选择器可以做得更好,但这将需要某种“手工制作”的通道管理。虽然可行,但相当繁琐。
另一个解决方案是向其他系统发送ping以获取更新,但这也可能显得有些丑陋。而且,我也不确定 @OnOpen
方法是否应该以这种方式使用。
理想情况下,传入的JMS消息将触发对客户端的WebSocket推送。有什么好的方法来实现这样的功能呢?