编程语言
首页 > 编程语言> > 如何使用Java EE 7 WebSockets实现对客户端的推送?

如何使用Java EE 7 WebSockets实现对客户端的推送?

作者:互联网

我浏览了很多Web Socket示例,演示幻灯片,它们主要集中在客户端发起客户端 – 服务器通信的相当简单的场景中.

我对另一个场景感兴趣,这似乎同样实用:纯服务器推送到客户端.

示例我想到的是一个更新网站上股票价值的应用程序.想象一下,有一个外部系统股票交易系统,它为每个订阅的股票价值变化发送JMS消息.

我想知道如何将这样的传入JMS事件转换为服务器推送,并从Java EE 7的角度高效地和惯用地转换它.

据我所知,我应该编写一个Web套接字端点

@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方法中创建一个线程,如this blog所示.实际上,这种方法可能会显示一个缺点,因为对于每个客户端,我需要创建一个新的,可能很长的生命线程.

使用选择器的NIO通道可以做得更好,但这需要某种“手工制作”的通道管理.可行,但相当繁琐.

另一个解决方案是ping其他系统进行更新,但同样会有点难看.另外我也不确定是否以这种方式使用@OnOpen方法.

理想情况下,传入的JMS消息将触发Web Socket推送到客户端.任何想法如何很好地实现这样的事情?

解决方法:

可能这不是最优雅的方式,只是为了展示想法.方法broadcast()将向所有连接的客户端发送消息.

@ServerEndpoint("/echo")
public class ServerEndPoint {

    private static Set<Session> userSessions = Collections.newSetFromMap(new ConcurrentHashMap<Session, Boolean>());

    @OnOpen
    public void onOpen(Session userSession) {
        userSessions.add(userSession);
    }

    @OnClose
    public void onClose(Session userSession) {
        userSessions.remove(userSession);
    }

    @OnMessage
    public void onMessage(String message, Session userSession) {
        broadcast(message);
    }

    public static void broadcast(String msg) {
        for (Session session : userSessions) {
            session.getAsyncRemote().sendText(msg);
        }
    }

}

标签:java,websocket,java-ee,java-ee-7
来源: https://codeday.me/bug/20191005/1855406.html