0

Camel の SEDA コンポーネントについて、ルーティング時にルーターが Exchange オブジェクトをキューから削除するかどうかを知っている人はいますか? ルーターは正常に動作していますが、Exchange オブジェクトがキューに保持されているのではないかと心配しているため、キューは継続的に大きくなります...

これは私のルーターです:

  public class MyRouter extends RouteBuilder {

      @Override
      public void configure() {
        from("seda:input")
          .choice()
          .when(someValue)
          .to("bean:someBean?method=whatever")
          .when(anotherValue)
          .to("bean:anotherBean?method=whatever");
      }
}

そうでない場合、ルーティングまたは処理された Exchange オブジェクトをキューから削除する方法を知っている人はいますか (アプリケーション内のいくつかの Bean にメッセージをルーティングしていますが、それらは正しく機能しています。唯一の問題はキューにあります)。

もう 1 つの質問は、入力 Exchange が選択条件のいずれにも一致しない場合はどうなるかということです。それもキューに入れられますか?

よろしくお願いします。

編集済み:クラウスの回答を読んだ後、ルーターに end() メソッドを追加しました。しかし、少なくともセダとルーターを一緒にテストするときは、私の問題は解決しません。いくつかのメッセージをキューに入れ、(メッセージを受信して​​いる) エンドポイントをモックしましたが、テストを実行するたびにキューがいっぱいになります。多分私は何かが欠けています。これは私のテストです:

@Test
  public void test() throws Exception {
    setAdviceConditions(); //This method sets the advices for mocking the endpoints

    Message message = createMessage("text", "text", "text"); //Body for the Exchange
    for (int i = 0; i < 10; i++) {
      template.sendBody("seda:aaa?size=10", message);
    }

    template.sendBody("seda:aaa?size=10", message); //java.lang.IllegalStateException: Queue full
  }

ありがとう!!

再編集:ルーターを確認した後、問題に気付きました。ルーターが読み取っていたエンドポイント(facepalm)とは異なるエンドポイントに書き込んでいました。

クラウスさん、ご回答ありがとうございます。

4

1 に答える 1

1

1)

はい、Exchange が SEDA キューからルーティングされると、すぐに削除されます。このコードは、poll() を使用してポーリングし、SEDA キューから一番上のメッセージを取得します。

SEDA はメモリ内ベースであるため、Exchange はメモリ内の SEDA キューに格納されます。キューが X メッセージのみを保持できるように、キュー サイズを構成できます。http://camel.apache.org/sedaの SEDA ドキュメントを参照してください。

また、管理コンソールから使用できる、キューをパージできる (キューを空にするなど) JMX 操作もあります。

2)

選択に一致する述語がない場合、何も起こりません。必要に応じて、これらのケースで何らかのロジックを実行する別の方法を使用できます。

また、選択後にルートを続行できることにも注意してください。

@Override
  public void configure() {
    from("seda:input")
      .choice()
        .when(someValue)
          .to("bean:someBean?method=whatever")
        .when(anotherValue)
          .to("bean:anotherBean?method=whatever")
      .end()
      .to("bean:allGoesHere");
  }

たとえば、上記の例では、選択が終了する場所を示す end() があります。その後、すべてのメッセージがそこに送られます (述語に一致しなかったメッセージも含まれます)。

于 2013-08-29T07:34:53.737 に答える