現在、Apache Camel を使用しています。私がやりたいのは、リクエスト応答を構成することです。これが私のルートです:
<route>
<from uri="jetty:http://localhost:8888/uebermittleAusweisdaten"/>
<process ref="TransformToXML"/>
<to uri ="xslt:mobako.sender.xsl"/>
<setHeader headerName="CamelJmsDestinationName">
<constant>queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1</constant>
</setHeader>
<setHeader headerName="JMS_IBM_Character_Set">
<constant>ISO8859_1</constant>
</setHeader>
<setHeader headerName="JMSCorrelationID">
<constant>cid</constant>
</setHeader>
<to uri="jms:queue:Queue.Write"/>
<marshal ref="xmljson"/>
<!-- <process ref="ResponseToHTML"/> -->
</route>
<route>
<from uri="jms:queue:Queue.Read" />
<setBody><simple>IN: ${headers}</simple></setBody>
<to uri="stream:out"/>
</route>
これらの reoutes では、入力に使用される http エンドポイントと、書き込み用に 1 つ、読み取り用に 1 つの 2 つの wmq エンドポイントがあることがわかります。
私が欲しいのは:
- http からリクエストを受け取り、それを処理し、リクエスト メッセージを Queue.Write wmq に書き込みます。
- 要求メッセージが Queue.Write wmq に書き込まれた後、Queue.Read wmq から応答を読み取り、それを最初のルートに送り返し、データ変換を行いたいと考えています。
- すべての処理が完了したら、応答を http エンドポイントに送り返したいと思います。
Apache Camel から次のドキュメントを読み、提案どおりに実行しようとしました。
しかし、何もうまくいきません。
- リクエストとリプライに別のエンドポイントを使用したため、InOut 交換パターンが機能しません
- 以下を追加して、Queue.Read エンドポイントで JMSCorrelationID と JMSReplyTo を宣言しようとしました。
<interceptFrom uri="jms:queue:ZKSEAP.LSMH.SERVICEBUS"> <setHeader headerName="JMSCorrelationID"> <constant>cid</constant> </setHeader> <setHeader headerName="JMSReplyTo"> <constant>queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1</constant> </setHeader> </interceptFrom>
しかし、それも機能しませんでした。さらに、次のエラーが継続的に発生しました。
org.apache.camel.ExchangeTimedOutException: OUT メッセージは次の時間内に受信されませんでした: 20000 ミリ秒の期限内に、correlationID を持つ応答メッセージ: cid が受信されませんでした。Exchange[メッセージ: http://security.fraport.de/zks-eap/uebermittleAusweisdatenurn:uuid:ID-FRA000000085404-55438-1402901836300-0-2esbp://services.fraport.de/lsmh/mobakoesbp://services.fraport.de/lsmh/zks-eapesbp://services.fraport.de/ lsmh/mobako11.2] org.apache.camel.component.jms.reply.ReplyManagerSupport.processReply(ReplyManagerSupport.java:133) org.apache.camel.component.jms.reply.TemporaryQueueReplyHandler.onTimeout(TemporaryQueueReplyHandler.java: 61) org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:53) で org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:30) で org .apache.camel.support.DefaultTimeoutMap.purge(DefaultTimeoutMap.java:212) at org.apache.camel.support.DefaultTimeoutMap.run(DefaultTimeoutMap.java:162) at java.util.concurrent.Executors$RunnableAdapter.java.util.concurrent.FutureTask.runAndReset (不明なソース) で java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301 で (不明なソース) を呼び出します (不明なソース) java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown) でソース) java.util.concurrent.ThreadPoolExecutor.runWorker (不明なソース) で java.util.concurrent.ThreadPoolExecutor$Worker.run (不明なソース) で java.lang.Thread.run (不明なソース)ThreadPoolExecutor$Worker.run(不明なソース) at java.lang.Thread.run(不明なソース)ThreadPoolExecutor$Worker.run(不明なソース) at java.lang.Thread.run(不明なソース)
参考までに、私は Mule ESB でこれを実行し、以下を使用して正常に実装しようとしました。
と追加
<vm:outbound-endpoint path="response"/>
2 番目のフローでの Queue.Read の後。
しかし、今のところ、Apache Camel で行う必要があります。Camelでこれを行う方法はありますか? または、私の問題を解決する方法について何か考えがありますか (wmq エンドポイントを変更せずに)。ご協力いただきありがとうございます。