web-dev-qa-db-ja.com

キャメルエンドvsendChoice-通常のクエリではありません

まず、はい、私は検索しました、そして、はい、私はすべてが指している同じApacheドキュメントを読みました。 :-)少し混乱があり、答えはわかっていると思うので、正しいと思った例を示して、答えが正しいと思うものを続けてください。ありがとう。ああ、endChoice()行のいくつかは厳密には必要ではなく、Camelがそれを理解することは知っていますが、使用しない理由がない限り、ブロックをきれいに描写するのが好きです。

.choice()
    .when(X1)
        // do stuff
        .choice()
            .when(Y)
                //do more stuff
            .endChoice()  // close inner when block
        .end() // close inner choice block
    .endChoice()  // close first outer when
    .when(X2)
        // do other stuff
    .endChoice()  // close second outer when
.end() // close outer choice

したがって、APIを最初に見たとき、end()はchoiceやsplitなどを閉じるためのものであり、endChoice()はwhenなどの選択肢を閉じるためのものだと思いました。後者は実際にはChoiceDefinitionを返すend()のように見えます。名前が少し良くなります。

しかし、「close inner choice block」というラベルの付いたend()を取り出すと、次の行であるendChoice()に進むことを意味します。次に、これは内側の選択ブロックを閉じますか?それを考えると、when(X2)はまだwhen(X1)ブロック内にあります。したがって、end()を削除するのではなく、endChoice()に置き換える必要があると思います。したがって、結果は次のようになります。

.choice()
    .when(X1)
        // do stuff
        .choice()
            .when(Y)
                //do more stuff
            .endChoice()  // close inner when block
        .endChoice() // close inner choice block
    .endChoice()  // close first outer when
    .when(X2)
        // do other stuff
    .endChoice()  // close second outer when
.end() // close outer choice

それで、これはキャメルでこれを処理する方法ですか?それとも、私が見逃しているもっと簡単な方法はありますか?御時間ありがとうございます。

16
Scott Law

SHORT ANSWER:私はこれについて自分自身を呼ぶので、他の誰もそうする必要はありません。答えは、あなたが間違ったことをしているので、ネストされた選択肢を持つべきではないということです。

LONG ANSWER:私は複雑なルートビルダーを継承し、それを明確にするためにクリーンアップしようとしていました。しかし、end()またはendChoice()のいずれかをまっすぐにして配置すると、問題が発生します。そして、はい、上記の修正はまだ物事を壊しました。キャメルがどのブロックに行くべきかをどうやって知っているのか理解できませんでした。調査し、入れ子の良い例を見つけようとすると、最終的に、Camelがnot実際に入れ子の選択のために設計されているという事実に気づきました。それはそれを可能にしますが、Javaの制限のため、それはうまくいきません。そこで、ネストされた選択肢を削除してみました。これは可能でしたが、次のような醜い冗長な条件を意味していました。

choice()
  .when(x and a)
    //do stuff xa
  .when(x not a)
    // do other x stuff
  .when(y and a)
    // do y stuff

私だけが少なくとも別のレベルを持っていただろう。私が読んだことをさらに考え、思い出すことは、啓蒙主義の第二のビットをもたらしました。キャメルの要点はルートを指示することです。それぞれの選択肢は、ブロックがプロセスをルートに向けているだけである必要があります。考えたり、処理したりするべきではありません。最終的に、私たちのグループは、ルートビルダーからBeanへのロジックのほとんどを削除するためにリファクタリングを行う予定です。私たちが目指しているデザインは、シンプルなものになります。

   from(uri)
     .bean(class, method)  // do any processing
     .choice()
       .when(header("result").isEqualTo("A")
          .to(routeA)
       .endChoice()
       .when(header("result").isEqualTo("B")
          .to(routeB)
       .endChoice()
       .when(header("result").isEqualTo("C")
          .to(route)
       .endChoice()
      .end()

あなたへの私のアドバイスは、ネストの選択を避けることです。特に複雑なもの。動作する可能性はありますが、後で変更する必要がある場合は信頼できません。ネストされた選択肢を使用したい場合は、達成しようとしていることを調べて、それが本当にルートビルダーに属しているかどうかを判断してください。

21
Scott Law