2016-01-29 1 views
2

Я пытаюсь настроить пружинные интеграции, чтобы отправить сообщение в очередь, а затем получить его, то есть что-то очень простое:Spring Integration DSL JMS Inbound/Outbound Шлюзы

myApp -> outbound message -> jmsQueue -> inbound message -> myApp 

То, что я думал, что был необходим для развязка должна была иметь шлюз сообщений с обоих концов процесса. Таким образом, моя первая попытка (который работает), выглядит следующим образом:

@MessagingGateway(name = "outboundGateway") 
public interface OutboundGateway { 


    @Gateway(requestChannel = OUTBOUND_CHANNEL) 
    void sentMyObject(final MyObject myObject); 
} 


@Bean 
public IntegrationFlow outboundFlow() { 
    return IntegrationFlows 
    .from(outboundChannel()) 
    .handle(Jms.outboundAdapter(connectionFactory).destination(myQueue)) 
    .get(); 
} 

@Bean 
public IntegrationFlow inboundFlow() { 
    return IntegrationFlows.from(Jms.messageDriverChannelAdapter(connectionFactory).destination(myQueue)) 
    .channel(inboundChannel()) 
    .handle(messageReceiverHandler()) 
    .get(); 
} 

Где messageReceiverHandler() является боб, который расширяет AbstractMessageHandler.

Итак, у нас есть шлюз сообщений для исходящего сообщения. То, что я предположил, состоит в том, что у нас также должен быть один для входящего сообщения, что позволяет нам отделить обработку входящих сообщений от кода приложения. Вместо этого у нас просто есть компонент, который расширяет AbstractMessageHandler, тогда как я ожидаю некоторую конфигурацию шлюза. Какое правильное использование?

Большое спасибо в приветствии.

ответ

1

Прежде всего, вам необходимо использовать Jms.outboundGateway() для обмена сообщениями request/reply вместо двух отдельных потоков; вы можете заставить его работать с адаптерами, но ему требуется больше работы и, в этом случае, не приносит никакой пользы.

Вы можете использовать:

... 
.from(outboundChannel()) 
.handle(Jms.outboundGateway(...)) 
.handle("myPojo", "someMethod") 
.get(); 

Где myPojo является боб, содержащий код приложения с помощью метода, принимая тип, возвращаемый шлюзом. Ответ от шлюза переходит к следующему элементу потока.

Обычно не рекомендуется наследовать классы каркаса, если у вас нет особых требований.

EDIT

Однако, это предполагает, что удаленная система, чтобы ответить с помощью заголовка JmsReplyTo. Кроме того, ответ от вашего второго обработчика будет отправлен на шлюз (который не должен иметь недействительный ответ).

Для получения полной асинхронной заявки/ответа ваша конфигурация верна, но вы можете использовать POJO в своем .handle().

+0

Большое спасибо за ответ Гэри. Я, очевидно, несколько смущен о том, как это должно работать. Реализация ваших рекомендаций дает: «org.springframework.integration.MessageTimeoutException: не удалось получить ответ JMS в течение времени: 5000 мс» Предположительно, потому что мой метод отправки ничего не возвращает. Если метод шлюза теперь возвращает myObject? Почему это должно быть так, поскольку я ожидаю, что это будет асинхронным. – deanpullen

+0

Ах, извините - я не заметил, что ваш шлюз вернул 'void'. Если вы хотите полностью асинхронно, ваш исходный код правильный (исключение вы можете использовать POJO для ответа). –

+0

Спасибо, Гэри, здорово, что вы помогаете людям выйти на весеннюю интеграцию. Я подозреваю, что это не мой последний вопрос! – deanpullen