web-dev-qa-db-ja.com

javaの軽量パブリッシュ/サブスクライブフレームワーク

パブリッシュ/サブスクライブパターンを提供するJavaの軽量フレームワークはありますか?

いくつかの理想的な機能

  • ジェネリックのサポート
  • パブリッシャーへの複数のサブスクライバーの登録
  • APIは主にインターフェースといくつかの有用な実装
  • 純粋にインメモリ、永続性、トランザクションの保証は必要ありません。

私はJMSについて知っていますが、それは私のニーズには行き過ぎです。パブリッシュ/サブスクライブされたデータは、ファイルシステムのスキャンの結果であり、スキャン結果は別のコンポーネントに送られて処理され、その後、別のコンポーネントに送られる前に処理されます。

編集:すべて同じプロセス内。 BeanのPropertyChangeListenerは、特定のアイテムを公開するのではなく、プロパティの変更を報告するため、完全にはカットしません。 「最後に公開されたオブジェクト」プロパティ、および公開されたオブジェクトを持つことで、ProprtyChangeListenerを機能させることができました。 PropertyChangeListenersはジェネリックをサポートせず、純粋なパブリッシュ/サブスクライブではなく、プロパティ変更セマンティクスに固執しています。 Java.util Observer/Observableパターンは良いでしょうが、Oberverは具象クラスです。

44
mdma

JMSは、構成するのと同じくらい軽いか重いです。たとえば、メモリ内キューを持つ1つのプロジェクトで HornetQ を使用します。セットアップは簡単で、JNDIベースの構成は必要なく、本当に使いやすいです。

Message Pub/SubのAPIとしてのJMSは、できる限り簡単だと思います。 (そして簡単ではありません;)

13

これは要件に適合するようです:

EventBus Google Guava Libraryから- "コンポーネントを相互に明示的に登録する必要なく、コンポーネント間のパブリッシュ/サブスクライブスタイルの通信"。別のスレッドでイベントをディスパッチする AsyncEventBus にすることもできます。

考慮すべき追加オプション:

  1. 同じプロセスにある場合は、 Observer パターンを使用できます。サブスクライバーはリスナーを追加し、イベント通知を受信できます。 Observable は、すでにJava APIの一部です。

  2. [〜#〜] ffmq [〜#〜] は完全なJava、light-weight、高速JMS 1.1キューの実装。

28
Andrejs

Springを使用しているので、Springに独自の lightweight event framework があることを知っているかどうかはわかりません。主にフレームワーク内で使用されますが、アプリケーションコードで完全に使用できます。

デフォルトでは、同期pub/subですが、ApplicationEventMulticasterを使用して非同期にすることができます。

8
skaffman

Camel も良い候補だと思います。特に publish-subscribe pattern の場合

キャメルは埋め込むことができ、軽量です。エンタープライズ統合パターン-アプリケーション内または他のアクターとの統合のための多くの便利なツールを提案します(したがって「統合」)。

Spring Integration と比較されますが、より完全なIMOです。

1
unludo

プロセスの境界を越えている場合、ある程度の「重み」が発生します。なぜJMSはヘビー級だと言うのですか? APIは非常に単純ですか?おそらく軽量の実装があります。たとえば、 link text 永続性やトランザクション性などの重いコストはオプションです。

これより軽いものが必要ですか?

0
djna

Bob Leeには http://snipt.org/GWm/QueueFileクラスがあります。これは単純な永続キューであり、複数のコンシューマーが使用できます。永続性は必要ないように思えますが、全体が非常に軽量であるため、依然として有用です。

0
Cagatay