2015-07-17 4 views
2

Существует одна очередь запросов, и очереди ответов создаются экземплярами клиентского сервера и привязаны к каждому экземпляру, а не к временным очередям.jms dynamic destination from original jmsReplyTo

В случае использования необходимо получить входящее сообщение jms, а затем отправить это сообщение в асинхронный процесс. После получения сообщения об асинхронном ответе от службы мне нужно принять эти результаты и ответить обратно на jmsReplyTo исходного сообщения. Шлюз Jms не будет работать в этом случае AFAIK>

Я использую адаптер канала с сообщением, управляемый сообщением, для сообщения с серией каналов и активаторов услуг для обработки исходящих вызовов процессов и асинхронных ответов. Я пытаюсь использовать DynamicDestinationResolver безрезультатно. Кроме того, я попытался установить адрес исходящего адресата программно, но не смог найти хороший способ сделать это.

Это похоже на общий шаблон, но я не смог найти хороший пример для полностью отключенного ответа на запрос асинхронного запроса. Disconnected означает, что обычный ответ на запрос async jms, похоже, не соответствует потребностям.

Контекст Config:

<!-- Input from Amq --> 

<amq:queue id="requestQueue" physicalName="${request.queue}" /> 

<int-jms:message-driven-channel-adapter id="jmsIn" 
            connection-factory="jmsConnectionFactory" 
            destination="requestQueue" 
            channel="queueRequestChannel" concurrent-consumers="5" /> 

<int:channel id="queueRequestChannel" /> 

<int:service-activator input-channel="queueRequestChannel" ref="switchMessageHandler" method="processSwitchMessage" 
     output-channel="cardNetworkOutChannel"/> 

<!-- Output to Card Network--> 
<int:channel id="cardNetworkOutChannel" /> 

<!--<int:service-activator input-channel="cardNetworkOutChannel" ref="cardNetworkHandler" method="send8583Message" />--> 

<!-- Simply used to mock the card network by transforming a SwithMessage to a SwitchMessageResponse * Not needed for target solution --> 
<int:transformer id="requestResponseTransformer" ref="nettyCardNetworkClientMock" input-channel="cardNetworkOutChannel" 
       method="process" output-channel="cardNetworkInChannel"/> 

<!-- Input from Card Network --> 
<int:channel id="cardNetworkInChannel" /> 

<int:service-activator input-channel="cardNetworkInChannel" ref="switchMessageHandler" method="sendSwitchMessage" 
         output-channel="queueReplyChannel"/> 


<int:channel id="queueReplyChannel"/> 

<int-jms:outbound-channel-adapter 
     destination-resolver="simpleDestinationResolver" connection-factory="jmsConnectionFactory" 
     channel="queueReplyChannel" destination-expression="headers.jms_replyTo" /> 
+0

Извините, но ваш вопрос непонятен. Всегда старайтесь быть очень конкретным ... например. «.. шлюз не сработает ...». Сторона клиента? или на стороне сервера? Вы должны иметь возможность использовать исходящие и управляемые сообщениями адаптеры с обеих сторон и использовать «destination-expression» в исходящих адаптерах. –

+0

Извините, Гэри. Это компонент на стороне сервера с точки зрения ActiveMQ. Приложение потребляет сообщения из фиксированной очереди. Затем он обменивается данными через TCP через определенный протокол и получает ответы через TCP. Эти ответы затем должны быть отправлены обратно в ActiveMQ, ссылаясь на исходный адрес jmsReplyTo сообщения входящего ActiveMQ. Во время разработки этот серверный компонент не знает, что будет отвечать на очереди. Клиенты (ActiveMQ) для этого приложения создают уникальную для клиента очередь ответов. –

+0

ОК, но вам нужно точно объяснить, в чем проблема. –

ответ

-1

Я просто обновил jms sample app сделать на стороне сервера использование независимых адаптеров вместо входящего шлюза, и он работает просто отлично ...

<!-- <jms:inbound-gateway id="jmsin" --> 
<!--       request-destination="requestQueue" --> 
<!--       request-channel="demoChannel"/> --> 

<channel id="demoChannel"/> 

<jms:message-driven-channel-adapter destination="requestQueue" channel="demoChannel" /> 

<service-activator input-channel="demoChannel" ref="demoBean" output-channel="reply" /> 

<channel id="reply" /> 

<jms:outbound-channel-adapter channel="reply" destination-expression="headers['jms_replyTo']" /> 

Включите ведение журнала DEBUG - мы выпустили много полезного материала.

EDIT

Я только что сделал это ASync по ...

<channel id="reply"> 
    <queue/> 
</channel> 

<jms:outbound-channel-adapter channel="reply" destination-expression="headers['jms_replyTo']"> 
    <poller fixed-delay="3000"/> 
</jms:outbound-channel-adapter> 

EDIT2

В зависимости от того, что вы используете на стороне клиента, многие клиенты требуют въездного идентификатор сообщения, который будет использоваться в качестве идентификатора корреляции. (Это верно для исходящего шлюза по умолчанию, с именованной очередью ответа, если вы не указали correlation-key).

Итак, чтобы настроить корреляцию, вы можете использовать заголовок enricher; Я только что проверил это ...

<chain input-channel="reply"> 
    <header-enricher> 
     <header name="jms_correlationId" expression="headers['jms_messageId']" /> 
    </header-enricher> 
    <jms:outbound-channel-adapter destination-expression="headers['jms_replyTo']"/> 
    <poller fixed-delay="1000" /> 
</chain> 

Это не проблема, если клиентская сторона сама устанавливает заголовок корреляционного идентификатора.

+0

Это выражение предназначения было тем, что я искал. Клиент все еще не получает ответ. Я отлаживал и не мог определить очередь исходящего адресата, но я включу регистрацию DEBUG и посмотрю, что я могу найти. Я думаю, что ваш пример был бы более точным, если бы у вас был асинхронный процесс, который отправлял сообщения с вашего demoBean и другого активатора службы, который асинхронно получал messsages до того, как ударил канал ответа в приведенном выше примере. В этом случае цепочка разбивается между исходным входящим сообщением на вашем demoChannel и исходящим каналом ответа. –

+0

См. Мое редактирование - добавление канала очереди делает его асинхронным. Все еще отлично работает для меня. –

+0

Что вы используете на стороне клиента? –

Смежные вопросы