Я отправляю «RequestSnapshot» в очередь Websphere-MQ, которая определена поставщиком как «S» (синхронная), поэтому я ожидаю получить ответ через шаблон интеграции Apache Camel inOut
, работающий в Fuse ESB.
from("direct:" + SEND_SUBSCRIPTION)
.routeId(getFinalRouteName(SEND_SUBSCRIPTION))
.log("Sending Request Snapshot request to webspheremq")
.bean(CreateSnapshotRequest.class)
.marshal(myDataFormat)
.convertBodyTo(String.class)
.inOut("webspheremq:queue:SNAPSHOT_REQUESTS.HT") // **1** works, but no Reply!!
.log("RequestSnapshot response: ${body}") // doesnt reach this line
Я знаю, что сообщение запроса снимка передается правильно, потому что после его отправки я получаю данные по другой теме MQ.
Проблема в том, что я не получаю ответа, выполнение останавливается на строке с пометкой **1**
- и через 20 секунд я получаю тайм-аут.
org.apache.camel.ExchangeTimedOutException: The OUT message was not received
within: 20000 millis due reply message with correlationID:
Camel-ID-XYZ012-54037-1385986757895-0-3 not received.
Обычно через код Java это делается по-другому, но здесь мы используем Fuse ESB
, и механизм inOut
должен отправить сообщение и получить ответ о том, что называется DYNAMIC REPLY-TO QUEUE
.
Мое понимание очереди «ответить на» несколько ограничено, я просто понимаю, что Fuse ESB должен прослушивать ответ на каком-то временном mq, но это должно работать прозрачно через inOut
.
Вот мой компонент конфигурации от blueprint.xml
:
<bean id="webspheremq" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="com.ibm.mq.jms.MQConnectionFactory">
<property name="transportType" value="1"/>
<property name="hostName" value="1.2.3.4"/>
<property name="port" value="1417"/>
<property name="channel" value="SOME.CHANNEL"/>
<property name="temporaryModel" value="SOME_MODEL_QUEUE"/>
<property name="CCSID" value="789"/>
<property name="queueManager" value="SOMEGATE"/>
<property name="brokerSubQueue" value="SYSTEM.JMS.ND.MACHINE.USER.*"/>
<property name="brokerControlQueue" value="SOME_SUBSCRIPTION.HT"/>
<property name="brokerQueueManager" value="SOMEHUB"/>
<property name="tempQPrefix" value="MACHINE.USER.*"/>
</bean>
</property>
</bean>
Другой вопрос, на мой взгляд, это порты брандмауэра, мы попросили открыть 1417 и 1499, но кажется, что открыт только 1417. Плюс я не знаю, открыты ли порты брандмауэра в обратную сторону, от WebsphereMQ обратно ко мне.
Буду очень признателен, если кто-нибудь сможет дать какой-нибудь совет!
Редактировать 1:
Я попробовал replyTo=queue:XYZ
предложение Клауса, и результат был таким:
2013-12-03 14:38:04,636 | WARN | eplyManager[FOO] | entQueueMessageListenerContainer
| ? ? | 153 - org.springframework.jms -
3.0.7.RELEASE | Setup of JMS message listener invoker failed for destination 'FOO'
- trying to recover. Cause: MQJMS2008: failed to open MQ queue ; nested exception is
com.ibm.mq.MQException: MQJE001: Completion Code 2, Reason 2085