2015-09-03 11 views
6

まず、はい、私は検索しました。私はちょっと混乱していると思います。私は答えを知っていると思うので、私が正しいと思った例を描きましょう。私はその答えが正しいと思います。ありがとう。ああ、私は、endChoice()の行のいくつかは厳密に必要ではなく、Camelはそれを理解することを知っていますが、それらを使用しない理由がない限り、ブロックはきれいに描かれています。Camel end vs endChoice - 通常のクエリではありません

.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での私の元の外観は、私が)最後は()(選択と分割し、そのendChoiceなどのクロージングもののためだと思ったときとそうでないような選択オプションを閉じるためでした。後者は実際にはChoiceDefinitionを返すend()です。それは名前を少し良くする。

しかし、私がend()内の "close inner choice block"というラベルを取り除くと、これは次の行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 

これはCamelでこれを処理する方法ですか?それとも、私が欠けている簡単な方法がありますか?御時間ありがとうございます。

答えて

10

短い答え: 私は誰もに持っていないので、これで自分自身を呼び出します、答えはあなたが間違ってそれをやっていると選択肢が入れ子になっているべきではないということです。

ロングアンサー: 私は複雑なルートビルダを継承し、それを明確にするためにクリーンアップしようとしていました。しかし、いずれかのend()またはendChoice()をまっすぐにして置くだけで、物事が壊れました。そして、はい、上記の修正はまだ問題を壊しました。私はキャメルがどのブロックに行くべきかを知っていなかった。調査とネスティングの良い例を見つけようとすると、最終的にキャメルはではなく、実際には入れ子の選択肢のために設計されたであるという事実を家にもたらしました。それは可能ですが、Javaの制限のためにうまくいきません。だから私は入れ子にした選択肢を削除しようとしました。

のみ鉱山が持っていただろう、少なくとも別のレベル:これが可能だったでしょうが、それはのような醜い冗長条件文を、意味しているだろう。私が読んだことをさらに思い起こし、想起させることは、啓発の第二のビットをもたらしました。キャメルの全ポイントがルートを案内しています。それぞれの選択肢はブロックがいつそのプロセスをルートに向けるべきかを示します。それは思考、処理、または何かであってはなりません。結局、私たちのグループは、ロジックの大部分をルートビルダから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() 

私はあなたの選択肢を避けることをお勧めします。特に複雑なもの。あなたはそれを働かせるかもしれませんが、あなたが後で変更を加えなければならないときにそれを信用することはできません。ネストされた選択肢を使用するように誘惑されている場合は、達成しようとしていることを調べて、実際にルートビルダーに属しているかどうかを判断します。

+2

良いアドバイス、私も選択肢を入れないようにしています。あなたの同僚かあなたの未来の自己はあなたに感謝します;)。 – helpermethod

関連する問題