2016-09-14 5 views
0

Мне нужно создать службу на основе Java 8, которая обеспечивает канал CometD, к которому могут подписаться несколько клиентов. Идея состоит в том, что сервер может отправлять уведомления клиентам, когда происходят определенные события.Как сделать службу Pub/Sub с CometD и Jetty

Я использую Jetty 9 в качестве контейнера сервлетов (необходимый для удовлетворения требований для моей группы). Я читал документацию CometD и искал какой-то пример, который я могу использовать. Документация обширна, но не помогает (отсутствие контекста), и я не смог найти достойный пример того, что я пытаюсь сделать.

Может ли кто-нибудь предоставить простой пример создания механизма публикации на Java, который можно использовать с Jetty? В противном случае, может кто-нибудь указать мне пример того, как это сделать?

Просьба сообщить.

ответ

1

CometD Project имеет outstanding task, чтобы вернуть учебники.

В этом конкретном вопросе был дан ответ на вопрос, связанный с ценами на акции на стороне сервера, для которых вы можете найти источник here, пока мы работаем над этим, чтобы вернуть его в интерактивном режиме в рамках документации.

Зачеркнув несколько деталей, услуга, которую вам нужно написать, похожа на сервис цены акций учебника: после получения внешнего события служба должна транслировать событие подписчикам.

@Service 
public class StockPriceService implements StockPriceEmitter.Listener 
{ 
    @Inject 
    private BayeuxServer bayeuxServer; 
    @Session 
    private LocalSession sender; 

    public void onUpdates(List<StockPriceEmitter.Update> updates) 
    { 
     for (StockPriceEmitter.Update update : updates) 
     { 
      // Create the channel name using the stock symbol. 
      String channelName = "/stock/" + update.getSymbol().toLowerCase(Locale.ENGLISH); 

      // Initialize the channel, making it persistent and lazy. 
      bayeuxServer.createChannelIfAbsent(channelName, new ConfigurableServerChannel.Initializer() 
      { 
       public void configureChannel(ConfigurableServerChannel channel) 
       { 
        channel.setPersistent(true); 
        channel.setLazy(true); 
       } 
      }); 

      // Convert the Update business object to a CometD-friendly format. 
      Map<String, Object> data = new HashMap<>(4); 
      data.put("symbol", update.getSymbol()); 
      data.put("oldValue", update.getOldValue()); 
      data.put("newValue", update.getNewValue()); 

      // Publish to all subscribers. 
      ServerChannel channel = bayeuxServer.getChannel(channelName); 
      channel.publish(sender, data); 
     } 
    } 
} 

StockPriceEmitter класса является источником ваших внешних событий, и публикует их StockPriceEmitter.Listener в виде StockPriceEmitter.Update событий.

Как внешние события передаются на сервер CometD - это подробная информация, которую скрывает StockPriceEmitter; это может быть сделано через сообщения JMS или путем опроса внешней службы REST или с помощью пользовательского сетевого протокола или путем опроса базы данных и т. д.

Важно, чтобы при поступлении внешних событий вызывается StockPriceService.onUpdates(...), и там вы можете конвертировать события в формат JSON CometD, а затем публиковать их на канале CometD.

Публикация на канал CometD, в свою очередь, отправит сообщение всем абонентам этого канала, обычно удаленным клиентам, таким как браузеры.

Канал CometD был сделан ленивый, потому что это способ избежать бомбардировки клиентов с очень частой скоростью обновления (скажем, более 2-4 обновлений в секунду). Вам нужно будет решить вопрос о ленивости канала на основе вашего конкретного варианта использования.