Я использую 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()?
Я люблю интеграцию с весной. Но это меня застопорило.
Хммм ... но не являются ли заголовки доступными только для следующего нижележащего потребителя?Другими словами, если я помещаю ExchangeMessage в заголовок после шага (3), тогда вызовите исходящий шлюз (вызовите его (4), будет ли он доступен для шага (5), например Service Activator, который захватывает ExchangeMessage в заголовке и вызывает его метод setResponse()? Или мне нужно вручную добавить заголовок на каждом шаге? Я уже пробовал что-то подобное раньше ... пытался получить доступ к заголовку 2 или 3 потребителя вниз по течению от того, когда заголовок Enricher добавил заголовок, и он говорит, что заголовок не существует ... –
Заголовок будет сохранен в каждом нисходящем сообщении. Единственным исключением было бы, если у вас есть настраиваемый трансформатор, который возвращает тип 'Message >' вместо полезной нагрузки (возможно, трансформатор хочет также манипулировать заголовками), в этом случае структура предполагает, что пользовательский трансформатор отвечает за распространение любых заголовков, которые он хочет сохранить, обычно используя метод copyHeaders() 'построителя сообщений. –
Вау, большое спасибо, я понятия не имел! Это точно информация, которую я искал в документах SI - как долго живут заголовки? Я верю, что произошло то, что я, должно быть, пытался получить доступ к заголовку * после * трансформатора, поэтому он больше не присутствовал. После игры с заголовками я пришел к выводу, что использование проверки претензий будет более чистым, поскольку мне не придется сериализовать и десериализовать для каждого сообщения. Но кажется, что мой случай использования - с использованием данных, хранящихся в проверке требований * и * текущей полезной нагрузки в одно и то же время, - слишком сложный. Еще раз спасибо! –