ダイナミックアパッチラクダのルート/コンテキストに関する質問を設計します

StackOverflow https://stackoverflow.com/questions/6336900

  •  27-10-2019
  •  | 
  •  

質問

システムで発生するイベントが公開されているActiveMQがあります。このプロジェクトでは、ユーザーがWatchListにエンティティを追加し、それらのエンティティにイベントがあるときはいつでも、興味のある参加者にメールを送信したいと思います。

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

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

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

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

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

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

  • CamelContextには、XMLファイルからルートをロードする方法がありますが、既存のルートを持続する方法はありません。これらの動的に作成されたルートを持続するための最も簡単な(そして効率的な)方法は何ですか?のこのスレッド キャメルユーザーリスト 私の要求を要約します。

役に立ちましたか?

解決

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

その後、単一の静的ルートまたは Pojo Consumer (以下を参照)シンプルな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...
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top