サーバーの起動時に読み込まれる次の静的ルートがあります。ポートで UDP メッセージをリッスンし、これらのメッセージを以下のルートで定義された seda キューにプッシュします。
from("mina:udp://hostipaddress:9998?sync=false").wireTap( "seda:sometag?size=100&blockWhenFull=true&multipleConsumers=true");
これで、これらのメッセージを受信/購読したい複数のクライアントを持つことができます。また、必要なフィードを動的に選択したいと考えています。各クライアントは、サブスクリプション要求 (REST) をサーバーに送信します (Spring-MVC、Jetty、Camel を使用して実装)。サーバーがリクエストを受け取るとすぐに、次のような新しい Camel ルートを作成します。
from("seda:sometag?multipleConsumers=true")
.routeId(RouteIdCreator.createRouteId(toIP, toPort, "sometag"))
.filter()
.xpath(this.xpathFilter).unmarshal().jaxb("sometag").marshal()
.json().wireTap("mina:udp://client_ip_address:20001?sync=false");
このルートが展開されると、client_ip_address: 20001 への UDP メッセージの送信が開始されます (上記の動的ルートで指定されているとおり)。
クライアントは、さまざまなフィルターをサーバーに送信できます。
このサーバーが新しいフィルターを受信した場合、次のことを行います。 1. 実行中のルートがあるかどうかを確認します (クライアントの IP とポートに基づいて) 2. 実行中のルートがある場合は、そのルートを停止し、古いフィルターでこのルートを削除します 3.次に、xpathfilter のみが最後のルートと異なる新しいルートを再作成します。
私の問題は、ステップ 2 に時間がかかることです (停止して再起動するため)。
この問題を解決する方法はありますか? 基本的にルートを停止・移行せずにルート内のXPath式を変更したい。
PS:公式の Camel メーリング リストにも投稿しました。