0

いくつかのルートを作成しました。以下は、問題が発生しているコードです。予想される動作は次のとおりです。

  1. Exchange はまず hourlyFeedParts キューで処理され、その後、dailyProcessor に渡されます。
  2. DailyProcessor では、プロパティ currHour が 23 であるかどうかがチェックされています。そうでなければ、それはただ受け継がれます。
  3. の場合currHour == 23、その中のコードが処理されます。この部分にも次の機能があります。

    • プロパティfeedsleftがゼロでない場合、選択肢内のすべてのコードcurrHour==23が実行されます。これで問題ありません。
    • プロパティfeedsLeftがゼロの場合、その中のコードが処理されます。内のコードは、さらにメッセージを探します。はいの場合、それらは に送信されhourlyFeedPartsます。ここで問題が発生します。処理するメッセージがある場合、それ以降のコードto("direct:hourlyFeedParts")は実行されません。ただし、何も返されない場合、コードは正常に機能します。

問題は、コードが で終わる可能性があると思いますto。では、代替案は何でしょうか?

from("direct:dailyProcessor")
  .choice()
    .when(simple("${property.currHour} == 23"))
    .choice()
      .when(simple("${property.feedsLeft} == 0"))
      .split(beanExpression(APNProcessor.class, "recheckFeeds"))
      .to("direct:hourlyFeedParts")
    .endChoice()
  .end()
  .split(beanExpression(new S3FileKeyProcessorFactory(), "setAPNS3Header"))
  .parallelProcessing()
  .id("APN Daily PreProcessor / S3 key  generator ")
  .log("Uploading file ${file:name}")
  .to("{{apn.destination}}")
  .id("APN Daily S3 > uploader")
.log("Uploaded file ${file:name} to S3")
.endChoice()
.end()
4

1 に答える 1

0

問題は入れ子になったchoice()だと思います。

内部の選択肢を別のルートに抽出してみてください。

from("direct:dailyProcessor")
  .choice()
    .when(simple("${property.currHour} == 23"))
       .to("direct:inner")
  .split(beanExpression(new S3FileKeyProcessorFactory(), "setAPNS3Header"))
  .parallelProcessing()
  .id("APN Daily PreProcessor / S3 key  generator ")
  .log("Uploading file ${file:name}")
  .to("{{apn.destination}}")
  .id("APN Daily S3 > uploader")
.log("Uploaded file ${file:name} to S3");

from("direct:inner")
   .choice()
      .when(simple("${property.feedsLeft} == 0"))
      .split(beanExpression(APNProcessor.class, "recheckFeeds"))
      .to("direct:hourlyFeedParts");

私はそれをテストしていませんが、あなたは要点を理解していると思います。

于 2013-11-07T15:58:11.800 に答える