ダイナミックアパッチラクダのルート/コンテキストに関する質問を設計します
-
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...
}
}