Верблюд: запрос ответа другой конечной точки

в настоящее время я работаю с 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>

На этих реаутах мы видим, что у меня есть конечная точка http, используемая для ввода, и две конечные точки wmq, 1 для записи и 1 для чтения.

Я хочу:

  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. Я попытался объявить JMSCorrelationID и JMSReplyTo в моей конечной точке Queue.Read, добавив:
<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 миллисекунд сообщения с должным ответом с идентификатором корреляции: 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) в org.apache.camel.support.DefaultTimeoutMap.run(DefaultTimeoutMap.java:162) в java.util.concurrent.Executo rs$RunnableAdapter.call(неизвестный источник) в java.util.concurrent.FutureTask.runAndReset(неизвестный источник) в java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(неизвестный источник) в java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask .run(неизвестный источник) в java.util.concurrent.ThreadPoolExecutor.runWorker(неизвестный источник) в java.util.concurrent.ThreadPoolExecutor$Worker.run(неизвестный источник) в java.lang.Thread.run(неизвестный источник)

Просто для вашего сведения, я попытался сделать это на Mule ESB и успешно реализовал его, используя:

Mule-Example

и добавление

<vm:outbound-endpoint path="response"/>

после моего Queue.Read на втором потоке.

Но пока мне нужно сделать это в Apache Camel. Есть ли способы сделать это в Camel? Или у вас есть идеи о том, как решить мою проблему (без изменения конечной точки wmq). Спасибо за вашу помощь.


person pokopang    schedule 16.06.2014    source источник


Ответы (1)


Поскольку вы устанавливаете хадер JMSDestiantion queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1, тогда Camel отправляет сообщение в очередь LSMH.ZKSEAP.SERVICEBUS, поэтому вам нужен прослушиватель в этой очереди, который обрабатывает сообщение и отправляет обратно ответное сообщение, определенное стандартным заголовком JMSReplyTo.

А так как вы не установили какой-либо специальный replyTo, то Camel использует временную очередь. Не уверен, что IBM WebSphere поддерживает это. Поэтому вы можете установить фиксированный заголовок JMSReplyTo. См. более подробную информацию в этом документе Camel JMS, поскольку в нем говорится об этом.

Второй маршрут, который у вас есть, скорее всего, не используется, потому что он читается из Queue.Read, которому вы не отправляли сообщение.

Но прочитайте эту страницу JMS еще раз и обратите внимание на различные виды ответов по JMS с общей/временной или эксклюзивной очередью ответов.

person Claus Ibsen    schedule 16.06.2014
comment
Могу ли я использовать прямую или другую конечную точку вместо очереди для слушателя? - person pokopang; 17.06.2014