Я просмотрел много примеров Web Socket, слайдов презентаций, и они в основном сосредоточены на довольно простых сценариях, в которых клиент-серверное взаимодействие инициируется клиентом.
Меня интересует другой сценарий, который кажется столь же практичным: чистое нажатие сервера на клиент.
Пример, который я имею в виду, — это приложение, которое обновляет стоимость акций на веб-сайте. Представьте себе, что существует внешняя система фондовой биржи, которая отправляет JMS-сообщение при каждом изменении стоимости подписки на акции.
Я хотел бы знать, как перевести такое входящее событие JMS в толчок сервера и эффективно и идиоматически с точки зрения Java EE 7.
Насколько я понимаю спецификацию, я должен написать конечную точку веб-сокета.
@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 с селекторами, но это потребует какого-то «ручного» управления каналами. Выполнимо, но довольно громоздко.
Другим решением было бы пропинговать какую-либо другую систему для получения обновлений, но опять же это было бы некрасиво. Кроме того, я также не уверен, предназначен ли метод @OnOpen
для использования таким образом.
В идеале входящее сообщение JMS инициирует отправку клиенту веб-сокета. Любые идеи, как красиво реализовать что-то подобное?