Во время разработки потоков Spring Integration
часто возникает необходимость
временно хранить
временные сообщения — в инструментарии доступно несколько различных механизмов.
часто возникает необходимость
временно хранить
временные сообщения — в инструментарии доступно несколько различных механизмов.
Довольно просто взять сообщение, использовать конструкцию обогащения заголовка SI и поместить сообщение в заголовок, используя выражение SpEL — фактически одно для имени ключа заголовка и одно для извлечения полезной нагрузки.
Следующий поток SI демонстрирует пример того, как это сделать:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-2.1.xsd">
<int:gateway id="headerManagementGateway"
service-interface="com.l8mdv.sample.HeaderManagementGateway"/> <int:chain input-channel="request-message-storage-channel" output-channel="request-message-retrieval-channel"> <int:header-enricher> <int:header name="#{T(com.l8mdv.sample.HeaderManagementGateway)
.REQUEST_PAYLOAD_HEADER_KEY}" expression="getPayload()"/> </int:header-enricher> </int:chain> <int:chain input-channel="request-message-retrieval-channel"> <int:transformer expression="headers.get(T(com.l8mdv.sample.HeaderManagementGateway)
.REQUEST_PAYLOAD_HEADER_KEY)"/>
</int:chain> </beans>
Этот пример может быть выполнен путем реализации шлюза следующим образом:
package com.l8mdv.sample; import org.springframework.integration.Message; import org.springframework.integration.annotation.Gateway; public interface HeaderManagementGateway { public static final String REQUEST_PAYLOAD_HEADER_KEY = "REQUEST_PAYLOAD_HEADER_KEY"; @Gateway (requestChannel = "request-message-storage-channel") public Message<String> send(Message<String> message); }
а затем запустить тест, такой как этот:
package com.l8mdv.sample; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.Message; import org.springframework.integration.support.MessageBuilder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static com.l8mdv.sample.HeaderManagementGateway.REQUEST_PAYLOAD_HEADER_KEY; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:META-INF/spring/header-management.xml"}) public class HeaderManagementIntegrationTest { @Autowired HeaderManagementGateway headerManagementGateway; @Test public void locatePayloadInHeader() { String payload = "Sample test message."; Message<String> message = MessageBuilder.withPayload(payload).build(); Message<String> response = headerManagementGateway.send(message); Assert.assertTrue(response.getHeaders().get(REQUEST_PAYLOAD_HEADER_KEY).equals(payload)); } @Test public void locateTransformedPayload() { String payload = "Sample test message."; Message<String> message = MessageBuilder.withPayload(payload).build(); Message<String> response = headerManagementGateway.send(message); Assert.assertTrue(response.getPayload().contains(payload)); } }
Полный исходный код и конфигурацию см. В модуле maven управления заголовками в git: //github.com/L8MDV/l8mdv-si-samples.git.