в настоящее время я работаю с 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 для чтения.
Я хочу:
- Получите запрос от http, обработайте его и напишите запрос в Queue.Write wmq.
- После того, как сообщение запроса было записано в Queue.Write wmq, я хотел бы прочитать ответ из Queue.Read wmq, затем отправить его обратно на первый маршрут и выполнить некоторое преобразование данных.
- После того, как все действия были выполнены, я хотел бы отправить ответ на конечную точку http.
Я прочитал следующую документацию от Apache Camel и попытался сделать так, как было предложено:
- http://camel.apache.org/request-reply.html
- http://camel.apache.org/jms.html
- И некоторые другие сопутствующие ресурсы
Но у меня ничего не работает.
- Шаблон обмена InOut не работает, потому что я использовал другую конечную точку для запроса-ответа.
- Я попытался объявить 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 и успешно реализовал его, используя:
и добавление
<vm:outbound-endpoint path="response"/>
после моего Queue.Read на втором потоке.
Но пока мне нужно сделать это в Apache Camel. Есть ли способы сделать это в Camel? Или у вас есть идеи о том, как решить мою проблему (без изменения конечной точки wmq). Спасибо за вашу помощь.