169.14. ライブ時間
同期されたクロックに関する最初の読み取り。
Camel を使用して JMS 上でリクエスト/リプライ(InOut)を行う場合、Camel は送信者側でタイムアウトを使用します。デフォルトは requestTimeout オプションから 20 秒です。これを制御するには、より高い/低レイテンシーの値を設定します。ただし、ライブ値の持続時間は、送信される JMS メッセージに設定されます。したがって、システム間でクロックを同期する必要があります。有効でない場合は、ライブ値の設定時間を無効にする必要がある場合があります。これは、Camel 2.8 以降の disableTimeToLive オプションを使用できるようになりました。そのため、このオプションを disableTimeToLive=true に設定すると、Camel は JMS メッセージの送信時に常にライブ値を設定し ません。ただし、 リクエストのタイムアウトは引き続きアクティブです。たとえば、JMS 上でリクエスト/応答を実行し、ライブ時間を無効にした場合、Camel は引き続き 20 秒のタイムアウトを使用します( requestTimeout オプション)。このオプションは、ほとんどの場合設定することもできます。そのため、requestTimeout と disableTimeToLive の 2 つのオプションにより、リクエスト/応答の実行時により詳細な制御が可能になります。
Camel 2.13/2.12.3 以降では、メッセージにヘッダーを指定して、設定されたエンドポイントではなく、リクエストのタイムアウト値として使用できます。以下に例を示します。
from("direct:someWhere")
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
from("direct:someWhere")
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
上記のルートでは、エンドポイント requestTimeout を 30 秒に設定します。そのため、Camel は応答メッセージがバーキューで戻されるまで 30 秒待機します。応答メッセージを受信しないと、org.apache.camel.ExchangeTimedOutException がエクスチェンジに設定され、Camel はメッセージをルーティングを継続し、例外により失敗し、Camel のエラーハンドラーが反応します。
メッセージごとのタイムアウト値を使用する場合は、定数値 "CamelJmsRequestTimeout" が長い型を持つ org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT のキー 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");
from("direct:someWhere")
.setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout"))
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
Camel を使用して JMS 経由で(InOut)を実行し、忘れると、デフォルトでは Camel はメッセージをライブ値に設定し ません。timeToLive オプションを使用して値を設定できます。たとえば、timeToLive=5000 を設定します。disableTimeToLive オプションを使用すると、InOnly メッセージングでも、ライブ時間の無効化を強制できます。requestTimeout オプションは InOnly メッセージングには使用されません。