4

Camel ルートとその 2 つのエンドポイント (Direct と Seda) について少し混乱しています。さて、私はこのようなルートを持っているとしましょう:

public void configure()
{
 from("direct:services")
  .process(//Some processing here)
  .to("http://ThirdPartyServers")
}

これに加えて、いくつかのリクエストを受信し、いくつかの処理を行ってから、メッセージをこのルートに渡してサードパーティのサーバーから応答を取得する残りの Web サービスがあります。次のように、Spring フレームワークを介してキャメル コンテキストをインスタンス化しました。

<camelContext id="appCamelContext" xmlns="http://camel.apache.org/schema/spring"
        trace="true" streamCache="true">
        <propertyPlaceholder id="properties"
            location="classpath:camel.properties" />
        <camel:routeBuilder ref="oneRouteBuilder" />
        <camel:routeBuilder ref="photosRouteBuilder" />
</camelContext>

問題は、このルートに複数の異なるメッセージを瞬時に送信することです。現在、Camel のドキュメントには、直接コンポーネントがシングル スレッドで呼び出され、同期的であると記載されています。すべてのメッセージが同時に処理されるのでしょうか、それとも 1 つずつ処理されるのでしょうか?

また、直接コンポーネントをセダに変更すると、違いはありますか?

ティア

更新 [Petter の回答後] : Petter の回答は明確になりましたが、同じ Direct および Seda コンポーネントに関して新たな疑問があります。私のルートが次のようになったとしましょう:

public void configure(){
from("direct:services")
 .choice()
 .when("some predicate here-Predicate1")
 .to("seda:predicate1")
 .otherwise()
 .to("seda:fallback")
 .end();

 from("seda:predicate1")
 .process("some processing")
 .to("http://ThirdPartyServers");

 from("seda:fallback")
 .process("some processing")
 .to("jms:fallbackqueue");
}

ここで、異なるスレッドからダイレクト コンポーネントに 5 つのメッセージを送信すると、これらのメッセージは同時に処理されます。上記のルートでわかるように、直接コンポーネントはメッセージを seda コンポーネントに送信します。それでは、異なる 5 つのメッセージすべてを処理する seda コンポーネントのスレッドは 1 つだけになるのでしょうか? 最後に、すべてのメッセージが 1 つずつ処理されることを意味しますか?

4

1 に答える 1

4

直接コンポーネントは、呼び出し元のスレッドで実行されます。簡略化すると、通常の Java メソッド呼び出しと同じです。複数のスレッドが直接エンドポイントを呼び出している限り、複数のメッセージがルートを通過できます。

SEDA (または VM) エンドポイントを呼び出すと、メッセージが (メモリ内の) キューに入れられます。(ルート内の) 別のスレッドが、キューからメッセージを 1 つずつ取り出して処理します。concurrentConsumers オプションを設定することで、seda コンシューマーが持つ必要があるスレッドの数を構成できます。デフォルトでは、メッセージを消費する 1 つのスレッドは、このルートに対して生成するスレッドの数に関係なく、一度に 1 つのメッセージのみが処理されるようにします。

それはあなたの声明に要約されます

瞬時に複数の異なるメッセージをこのルートに送信します

これが異なるスレッドを意味する場合、またはシーケンス内の 1 つのスレッドからのみの場合、

于 2013-05-02T07:03:54.357 に答える