1

システムで発生するイベントが公開されるActiveMQがあります。このプロジェクトでは、ユーザーが監視リストにエンティティを追加します。これらのエンティティでイベントが発生するたびに、関心のある参加者にメールを送信したいと思います。

ユースケースは、大まかに言って、カタログの製品情報ページに関心を示し、その製品で何らかのアクティビティが発生するたびに電子メールが送信されることを意味します(価格が下がる、肯定的なレビューがあるなど)。私はこの相互作用をラクダのルートとしてモデル化しました。

したがって、たとえば、この製品の評価が5に等しいときはいつでも、ユーザーが私に電子メールを送信すると言うと、次のルートがラクダのコンテキストに追加されます。

from("activemq:topic:events.product.save").filter().xpath("/object[<object id>]/rating").isEqualTo("5").to("email:<user's email>")

同様に、製品に新しいコメントがあるたびにユーザーに通知したい場合は、別のルートが作成されます。これにより、各ユーザーが関心のある時計を追加し始めると、何千ものルートが作成される可能性があります。

私が持っているいくつかの質問は次のとおりです。

  • これは動的ルートを作成するための許容可能な方法ですか?私が検討しているオプションの1つは、受信者リストを使用することです。しかし、受信者リストを返すBeanにメッセージをルーティングすることをエレガントにするソリューションを思い付くことができませんでした。たとえば、上記で説明したケースの場合、Beanには、返される受信者リストを確認するためのif-elseがたくさんありますか?

  • camelcontextには、xmlファイルからルートをロードするメソッドがありますが、既存のルートを永続化するメソッドはありません。これらの動的に作成されたルートを永続化するための最も簡単な(そして効率的な)方法は何でしょうか?camel-usersリストのこのスレッドは、私の要求を要約したものです。

4

1 に答える 1

2

サブスクリプション要件の動的な性質を考えると、動的なルートを作成するのではなく、データベースを使用して情報を保存する必要があります。これは、はるかにスケーラブルで適切なテクノロジーの使用です...

次に、単純なPOJO Beanを使用して製品更新メッセージを処理できる単一の静的ルートまたはPOJOコンシューマー(以下を参照)のみが必要になります(Beanバインディングが役立つなど)。次に、POJO Beanは、データベースにクエリを実行してすべての「関心のある」ユーザーを検索し、ラクダメールを使用して電子メールを送信します。

public class NotificationBean {

    @Consume(uri="activemq:topic:events.product.save")
    public void onUpdate(@XPath("/object/id") String id, 
                         @XPath("/object/rating") String rating) {
        //query database for subscriptions for this product ID/rating, etc.
        //for each interested subscriber
            //send email (camel-mail, etc)
    }

    public void addSubscription(String productID, Integer rating, String email) {
        //create/update subscription entry in database, etc...
    }
}
于 2011-06-14T17:18:13.203 に答える