パブリッシュ/サブスクライブパターンを提供するJavaの軽量フレームワークはありますか?
いくつかの理想的な機能
私はJMSについて知っていますが、それは私のニーズには行き過ぎです。パブリッシュ/サブスクライブされたデータは、ファイルシステムのスキャンの結果であり、スキャン結果は別のコンポーネントに送られて処理され、その後、別のコンポーネントに送られる前に処理されます。
編集:すべて同じプロセス内。 BeanのPropertyChangeListenerは、特定のアイテムを公開するのではなく、プロパティの変更を報告するため、完全にはカットしません。 「最後に公開されたオブジェクト」プロパティ、および公開されたオブジェクトを持つことで、ProprtyChangeListenerを機能させることができました。 PropertyChangeListenersはジェネリックをサポートせず、純粋なパブリッシュ/サブスクライブではなく、プロパティ変更セマンティクスに固執しています。 Java.util Observer/Observableパターンは良いでしょうが、Oberverは具象クラスです。
JMSは、構成するのと同じくらい軽いか重いです。たとえば、メモリ内キューを持つ1つのプロジェクトで HornetQ を使用します。セットアップは簡単で、JNDIベースの構成は必要なく、本当に使いやすいです。
Message Pub/SubのAPIとしてのJMSは、できる限り簡単だと思います。 (そして簡単ではありません;)
これは要件に適合するようです:
EventBus Google Guava Libraryから- "コンポーネントを相互に明示的に登録する必要なく、コンポーネント間のパブリッシュ/サブスクライブスタイルの通信"。別のスレッドでイベントをディスパッチする AsyncEventBus にすることもできます。
考慮すべき追加オプション:
同じプロセスにある場合は、 Observer パターンを使用できます。サブスクライバーはリスナーを追加し、イベント通知を受信できます。 Observable は、すでにJava APIの一部です。
[〜#〜] ffmq [〜#〜] は完全なJava、light-weight、高速JMS 1.1キューの実装。
Springを使用しているので、Springに独自の lightweight event framework があることを知っているかどうかはわかりません。主にフレームワーク内で使用されますが、アプリケーションコードで完全に使用できます。
デフォルトでは、同期pub/subですが、ApplicationEventMulticaster
を使用して非同期にすることができます。
Camel も良い候補だと思います。特に publish-subscribe pattern の場合
キャメルは埋め込むことができ、軽量です。エンタープライズ統合パターン-アプリケーション内または他のアクターとの統合のための多くの便利なツールを提案します(したがって「統合」)。
Spring Integration と比較されますが、より完全なIMOです。
プロセスの境界を越えている場合、ある程度の「重み」が発生します。なぜJMSはヘビー級だと言うのですか? APIは非常に単純ですか?おそらく軽量の実装があります。たとえば、 link text 永続性やトランザクション性などの重いコストはオプションです。
これより軽いものが必要ですか?
Bob Leeには http://snipt.org/GWm/ にQueueFile
クラスがあります。これは単純な永続キューであり、複数のコンシューマーが使用できます。永続性は必要ないように思えますが、全体が非常に軽量であるため、依然として有用です。