2016-09-14 2 views
0

複数のクライアントが購読できるCometDチャネルを提供するJava 8ベースのサービスを作成する必要があります。考えられるのは、特定のイベントが発生したときにサーバーがクライアントに通知を送信できるということです。CometDとJettyでPub/Subサービスを作成する方法

私はサーブレットコンテナとしてJetty 9を使用しています(私のグループの要件を満たすために必要です)。私はCometDのドキュメントを読んでいて、私が使用できるいくつかの例を探しています。ドキュメンテーションは広範囲ですが、助けにならない(文脈の欠如)、私は何をしようとしているかのまともな例を見つけることができませんでした。

誰かがJettyで使用できる公開メカニズムをJavaで作成する簡単な例を提供できますか?誰かが私にそれを行う方法の例を指摘することができますか?

お知らせください。

答えて

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.Updateイベントの形でStockPriceEmitter.Listenerにそれらを公開しています。

外部イベントがCometDサーバーに中継される仕組みは、StockPriceEmitterが非表示にする詳細です。 JMSメッセージ、外部RESTサービスのポーリング、カスタムネットワークプロトコルのポーリング、データベースのポーリングなどを行うことができます。

重要なことは、外部イベントが到着するとStockPriceService.onUpdates(...)が呼び出され、そのイベントをCometDのフレンドリーなJSON形式に変換し、CometDチャンネルに公開することができます。

CometDチャネルに公開すると、そのチャネルのすべてのサブスクライバ(通常はブラウザなどのリモートクライアント)にメッセージが送信されます。

CometDチャンネルは、非常に頻繁な更新レート(たとえば、1秒あたり2〜4回の更新)以上でクライアントを爆破するのを避ける方法であるため、遅延型です。です。 特定のユースケースに基づいて、チャンネルの怠惰を判断する必要があります。

関連する問題