1

サーバーの起動時に読み込まれる次の静的ルートがあります。ポートで 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 メーリング リストにも投稿しました。

4

1 に答える 1

2

新しいサブスクリプションを受け取ったときに、xpath フィルターをデータベース (基本的には、IP とフィルターが関連付けられた単純なテーブル) に保存することを試みることができます。次に、このフィルターをルートのデータベースから読み取り、フィルターとして使用できます。

from("seda:sometag?multipleConsumers=true")
                .routeId(RouteIdCreator.createRouteId(toIP, toPort, "sometag"))
                .setHeader("ip").constant(client_ip_adresse)
                .filter().xpath(simple("${bean:xpathFilterComponent?methode=find}"))
                .unmarshal().jaxb("sometag").marshal()
                .json().wireTap("mina:udp://client_ip_address:20001?sync=false");

そして、あなたの豆は次のようになります

public class XpathFilterCompnent {

       public void save(String ip, String filter){
         //store a filter for an ip in database, when a subscription is received
       }

       public void find(@Header("ip") String ip){
         String filter = ... //retreive filter from database
         return filter;
       }
}
于 2012-07-29T16:28:47.987 に答える