1

現在、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 エンドポイントがあることがわかります。

私が欲しいのは:

  1. http からリクエストを受け取り、それを処理し、リクエスト メッセージを Queue.Write wmq に書き込みます。
  2. 要求メッセージが Queue.Write wmq に書き込まれた後、Queue.Read wmq から応答を読み取り、それを最初のルートに送り返し、データ変換を行いたいと考えています。
  3. すべての処理が完了したら、応答を http エンドポイントに送り返したいと思います。

Apache Camel から次のドキュメントを読み、提案どおりに実行しようとしました。

  1. http://camel.apache.org/request-reply.html
  2. http://camel.apache.org/jms.html
  3. その他の関連リソース

しかし、何もうまくいきません。

  1. リクエストとリプライに別のエンドポイントを使用したため、InOut 交換パターンが機能しません
  2. 以下を追加して、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 エンドポイントを変更せずに)。ご協力いただきありがとうございます。

4

1 に答える 1

1

JMSDestiantion ハダーを設定するとqueue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1、Camel はメッセージをキューに送信するため、メッセージを処理し、標準ヘッダーLSMH.ZKSEAP.SERVICEBUSで定義された応答メッセージを送り返すリスナーがそのキューに必要になります。JMSReplyTo

また、特別な replyTo を設定していないため、Camel は一時キューを使用します。IBM WebSphere がこれをサポートしているかどうかは不明です。したがって、固定の JMSReplyTo ヘッダーを設定する必要がある場合があります。詳細については、その Camel JMS doc を参照してください。

あなたが持っている2番目のルートはQueue.Read、メッセージを送信しなかった読み取り元であるため、使用されていない可能性があります.

ただし、その JMS ページをもう一度読んで、共有/一時または排他的な応答キューを使用した JMS を介したさまざまな種類の応答に注意してください。

于 2014-06-16T17:25:13.783 に答える