Как динамически создавать Spring Integration MessageChannels
В интеграции Spring канал сообщений может быть настроен так:
<int:channel id="get_send_channel" />
<int:channel id="get_receive_channel">
<int:queue capacity='10' />
</int:channel>
<int-http:outbound-gateway id="get.outbound.gateway"
request-channel="get_send_channel"
url="http://localhost:8080/greeting"
http-method="GET" reply-channel="get_receive_channel"
expected-response-type="java.lang.String">
</int-http:outbound-gateway>
и используется так:
@SpringBootApplication
@ImportResource("http-outbound-gateway.xml")
public class HttpApplication {
@Autowired
@Qualifier("get_send_channel")
MessageChannel getSendChannel;
@Autowired
@Qualifier("get_receive_channel")
PollableChannel getReceiveChannel;
public static void main(String[] args) {
SpringApplication.run(HttpApplication.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
Message<?> message = MessageBuilder.withPayload("").build();
getSendChannel.send(message);
System.out.println(getReceiveChannel.receive().getPayload());
};
}
Как MessageChannel может быть создан и зарегистрирован динамически?
Выше код из этого примера
Я сейчас попробовал это
return IntegrationFlows.from(MessageChannels.rendezvous("getSend1"))
.handle(Http.outboundGateway("http://localhost:8080/greeting").httpMethod(HttpMethod.GET))
.channel(MessageChannels.queue("getReceive1")).get();
с поллером по умолчанию, но есть сообщение:
preReceive on channel 'getSend1'
postReceive on channel 'getSend1', message is null
Received no Message during the poll, returning 'false'
Таким образом, конфигурация кажется неправильной и сообщение не извлекается из URL.
1 ответ
Решение
Это работает так:
@Bean
public IntegrationFlow inbound() {
return IntegrationFlows
.from(this.integerMessageSource(), c -> c.poller(Pollers.fixedRate(2000)))
.handle(Http.outboundGateway("http://localhost:8055/greeting")
.httpMethod(HttpMethod.GET).expectedResponseType(String.class))
.channel(MessageChannels.queue("getReceive"))
.handle(Http.outboundGateway("http://localhost:8055/greeting").httpMethod(HttpMethod.POST)
.expectedResponseType(String.class))
.channel(MessageChannels.queue("postReceive"))
.handle(Http.outboundGateway("http://localhost:8055/greeting-final").httpMethod(HttpMethod.POST)
.expectedResponseType(String.class))
.channel(MessageChannels.queue("postReceiveFinal"))
.get();
}
Это действительно для первого URL, затем отправляет ответ на второй URL, а затем отправляет ответ на третий URL и получает окончательный ответ.