2016-12-12 2 views
0

Я использую Spring Integration для отправки SOAP-запроса, получения ответа SOAP и его обработки. Я также использую (или пытаюсь использовать) Претензию Проверку рисунок, чтобы сохранить первоначальный запрос SOAP и ответ, в Object, простой POJO, называемый ExchangeMessage, который выглядит следующим образом:Spring Integration: Как обновить объект в запросе Проверка с текущей полезной нагрузкой?

public class ExchangeMessage { 

    protected String request; 
    protected String response; 
    ... 

Это то, что мои поток в настоящее время выглядит следующим образом:

(1) <int:transformer input-channel="transformerChannel" output-channel="requestChannel"/> 
(2) <int:gateway default-request-channel="transformerChannel" /> 

<int:chain input-channel="requestChannel" output-channel="loggerChannel"> 
(3) <int:service-activator ref="exchangeMessageServiceActivator" /> 
(4) <int:claim-check-in/> 
(5) <int:claim-check-out/> 
(6) <int:transformer expression="payload.getRequest()" /> 
(7) <ws:outbound-gateway uri="http://.../> 
(8) <int:transformer ref="xmlMsgToPojoTransformer" /> 

    ... processing ... 

</int:chain> 

в основном, в (1) и (2) Я посылаю простой POJO для входящего шлюза, и он превращается в простой SOAP-запрос (строка).

В цепочке, в (3), компонент exchangeMessageServiceActivator принимает строку и создает объект ExchangeMessage, вызывая метод setRequest() с запросом SOAP.

В (4) Я сохраняю вновь созданный ExchangeMessage в проверке требований.

В (5) я проверяю его и в (6) и (7) отправляет содержимое ExchangeMessage.getRequest() в WS Outbound Gateway. Я понимаю, что мог бы сделать это, используя Header Enricher, но так как я хочу сохранить объект ExchangeMessage в любом случае, я решил, что это почти то же самое, хотя вызов сразу же после регистрации заявки некрасиво.

Проблема начинается между (7) и (8). Полезной нагрузкой (7) является ответ SOAP. Перед тем, как удалите его в объект (а затем обработать его ...), я хочу получить ExchangeMessage с помощью < претензии-выписка>, вызвать метод ExchangeMessage.setResponse() с помощью SOAP Response и , затем конвертировать SOAP-ответ в объект для обработки.

Проблема в том, что если между (7) и (8) я придерживаюсь < претензии-выписка>, я теряю исходную полезную нагрузку (7), ответ SOAP.

Я думал об использовании какого-либо активатора обслуживания между (7) и (8), чтобы каким-то образом загрузить ExchangeMessage из проверки заявки и вызвать его метод setResponse(), используя полезную нагрузку из (7), но Я не могу понять, как это сделать. Я получил это далеко:

SimpleMessageStore simpleMessageStore = (SimpleMessageStore)context.getBean("simpleMessageStore"); 
ClaimCheckOutTransformer claimCheckOutTransformer = new ClaimCheckOutTransformer(simpleMessageStore); 
claimCheckOutTransformer.transform(Message???); 

Если полезная нагрузка для этого Service Activator будет струна (SOAP Response), где делает сообщение придет от этого мне нужно пройти как ClaimCheckOutTransformer.transform()?

Я люблю интеграцию с весной. Но это меня застопорило.

ответ

0

Было бы проще сэкономить ExchangeMessage в заголовке, используя заголовок-обогатитель, вместо использования проверки заявки.

Таким образом, он доступен вам позже в потоке для звонка setResponse().

В противном случае вам нужно будет сэкономить полезную нагрузку (от 4 до 5), а также ответ перед повторной проверкой, но это будет более сложный поток, чем просто сэкономить первоначальный объект, а не использовать проверка претензии совсем.

+0

Хммм ... но не являются ли заголовки доступными только для следующего нижележащего потребителя?Другими словами, если я помещаю ExchangeMessage в заголовок после шага (3), тогда вызовите исходящий шлюз (вызовите его (4), будет ли он доступен для шага (5), например Service Activator, который захватывает ExchangeMessage в заголовке и вызывает его метод setResponse()? Или мне нужно вручную добавить заголовок на каждом шаге? Я уже пробовал что-то подобное раньше ... пытался получить доступ к заголовку 2 или 3 потребителя вниз по течению от того, когда заголовок Enricher добавил заголовок, и он говорит, что заголовок не существует ... –

+0

Заголовок будет сохранен в каждом нисходящем сообщении. Единственным исключением было бы, если у вас есть настраиваемый трансформатор, который возвращает тип 'Message ' вместо полезной нагрузки (возможно, трансформатор хочет также манипулировать заголовками), в этом случае структура предполагает, что пользовательский трансформатор отвечает за распространение любых заголовков, которые он хочет сохранить, обычно используя метод copyHeaders() 'построителя сообщений. –

+0

Вау, большое спасибо, я понятия не имел! Это точно информация, которую я искал в документах SI - как долго живут заголовки? Я верю, что произошло то, что я, должно быть, пытался получить доступ к заголовку * после * трансформатора, поэтому он больше не присутствовал. После игры с заголовками я пришел к выводу, что использование проверки претензий будет более чистым, поскольку мне не придется сериализовать и десериализовать для каждого сообщения. Но кажется, что мой случай использования - с использованием данных, хранящихся в проверке требований * и * текущей полезной нагрузки в одно и то же время, - слишком сложный. Еще раз спасибо! –

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