5

モデルがさまざまなソースから非常に頻繁に更新される Java EE アプリケーションがあります。さらに、リモート EJB を介していくつかのアクションをトリガーするリッチ クライアント アプリケーションがありますが、モデルの変更を少なくとも 1 秒ごとに表示する必要があります。

Java EE アプリケーションから Java クライアント アプリケーションに変更を送信するための最も簡単で最適なオプションはどれですか? これまで、次のオプションがあります。

  1. クライアントから毎秒リモート EJB をポーリングする
  2. サーブレットのポーリング (Java オブジェクトのシリアライゼーションの代わりに json/xml を使用することをお勧めしますか? 他のシリアライゼーションはありますか?)
  3. websockets (ここで Java オブジェクトを送信することは可能ですか? または、たとえば結果を Json にシリアル化する必要がありますか?)
  4. tcp ソケット接続 (サーバーは、起動時にクライアントが接続するポートを提供します。モデルの変更は、標準オブジェクトのシリアル化を介して送信されます。これは、Java EE アプリで「許可」されていますか?)
4

1 に答える 1

3

オプション 1が最も簡単で、非同期 EJB メソッドを使用できます。

サーバ

@Asynchronous
public Future<String> getUpdatedModel() {
    //here create blocking process until something interesting happen
    return new AsyncResult<String>("model has changed!");
}

クライアント

    Future<String> updatedModel = bean.getUpdatedModel();
        while(true){
            String response = updatedModel.get();
            //process response here
        }

オプション 2はオプション 1 のように見えますが、オブジェクトのマーシャリングに注意する必要があるため、単純なサーブレットを使用する必要はありません。

Websocket が Java EE7 に含まれる予定であるため、オプション 3は興味深いようです (サーブレットにオープンソースの comet 実装を使用できるようになりました)。私の意見では、エンタープライズ アプリケーションでの通信用には設計されていませんが、ユースケースには問題ないかもしれません。利用可能な JSON シリアライザー (gson など) はたくさんあります。私は JS と Java の間でそのような通信を使用しており、正常に動作します。

オプション 4は Java EE の主要な原則 (独自のソケットを開くことは禁止されています) に違反しているため、使用しないことをお勧めします。

オプション 5 Xie に耳を傾け、JMS を使用する! JMS トピックを使用する場合は、特定のイベントが発生したときにメッセージを送信するだけで、接続されているすべてのクライアントが非同期でメッセージを受信できます。この種の問題を解決する Java EE の自然な方法は、アウトオブボックス トランザクション、メッセージの再配信、および必要に応じて永続化することです。

于 2013-06-30T22:55:16.260 に答える