178.14. 生きる時間について

上記の同期クロックについて最初に読んでください。

Camel を使用して JMS 経由で要求/応答 (InOut) を行う場合に、Camel は送信側でタイムアウトを使用します。これは、requestTimeout オプションのデフォルトの 20 秒です。これは、より高い/より低い値を設定することで制御できます。ただし、送信される JMS メッセージには存続時間の値が設定されたままです。そのため、システム間でクロックを同期する必要があります。そうでない場合は、設定されている存続時間の値を無効にすることができます。これは、Camel 2.8 以降の disableTimeToLive オプションを使用して可能になりました。したがって、このオプションを disableTimeToLive=true に設定すると、Camel では JMS メッセージの送信時に time to live の値は設定 されませんただし、リクエストのタイムアウトはまだ有効です。たとえば、JMS を介してリクエスト/リプライを行い、time to live を無効にしている場合に、Camel は引き続き 20 秒のタイムアウトを使用します (requestTimeout オプション)。もちろん、そのオプションも設定できます。そのため、requestTimeoutdisableTimeToLive の 2 つのオプションを使用すると、リクエスト/リプライを行うときにきめ細かい制御が可能になります。

Camel 2.13/2.12.3 以降では、メッセージにヘッダーを指定してオーバーライドし、エンドポイントの設定値の代わりにリクエストのタイムアウト値として使用できます。以下に例を示します。

   from("direct:someWhere")
     .to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
     .to("bean:processReply");

上記のルートでは、requestTimeout が 30 秒に設定されたエンドポイントがあります。そのため、Camel は、その応答メッセージがバーキューに戻ってくるまで最大 30 秒待機します。応答メッセージが受信されない場合、Exchange で org.apache.camel.ExchangeTimedOutException が設定され、Camel はメッセージのルーティングを続行しますが、例外が原因で失敗し、Camel のエラーハンドラーが反応します。

メッセージごとのタイムアウト値を使用する場合は、長型としてタイムアウト値を持つ定数値 "CamelJmsRequestTimeout" を持つキー org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT でヘッダーを設定できます。

たとえば、bean を使用して、以下に示すようにサービス Bean で "whatIsTheTimeout" メソッドを呼び出すなど、個々のメッセージごとのタイムアウト値を計算できます。

   from("direct:someWhere")
     .setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout"))
     .to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
     .to("bean:processReply");

Camel を使用して JMS を介して fire および forget (InOut) を行う場合には、Camel はデフォルトで、メッセージに Time to Live 値を設定 しませんtimeToLive オプションを使用して値を設定できます。たとえば、5 秒を示すには、timeToLive=5000 を設定します。オプション disableTimeToLive を使用して、有効期限を強制的に無効にすることができます。また、InOnly メッセージングについても同様です。requestTimeout オプションは、InOnly メッセージングには使用されていません。