Я хочу использовать Spring Integration для предоставления простого веб-сервиса, который помещает входящее сообщение в ActiveMQ и немедленно отвечает. Моим решением go было MarshallingWebServiceInboundGateway, подключенный к Jms.outboundAdapter с IntegrationFlow. Ниже фрагментов шлюза и IntegrationFlow. Проблема в том, что Адаптер не обеспечивает ответ (дух), который ожидает шлюз. Ответ, который я получаю от сервиса, - пустой 202 с задержкой около 1500 мс Это вызвано таймаутом ответа, который я вижу в журналах TRACE:
"2020-04-14 17:17:50.101 TRACE 26524 --- [nio-8080-exec-6] o.s.integration.core.MessagingTemplate : Failed to receive message from channel 'org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@518ffd27' within timeout: 1000"
Никаких жестких исключений нигде нет. Другая проблема в том, что я не могу генерировать ответ сам. Я не могу ничего добавить в IntegrationFlow после .handle с адаптером.
- Любой другой способ попытаться выполнить сценарий?
- Как, если это вообще возможно, я могу генерировать и возвращать ответ в ситуации, когда нет лучшего подхода?
Скорее всего, правильным способом было бы использовать шлюзы на обоих концах, но это невозможно. Я не могу дождаться ответа, пока сообщение в очереди не будет использовано и обработано.
'' '
@Bean
public MarshallingWebServiceInboundGateway greetingWebServiceInboundGateway() {
MarshallingWebServiceInboundGateway inboundGateway = new MarshallingWebServiceInboundGateway(
jaxb2Marshaller()
);
inboundGateway.setRequestChannelName("greetingAsync.input");
inboundGateway.setLoggingEnabled(true);
return inboundGateway;
}
@Bean
public IntegrationFlow greetingAsync() {
return f -> f
.log(LoggingHandler.Level.INFO)
.handle(Jms.outboundAdapter(this.jmsConnectionFactory)
.configureJmsTemplate(c -> {
c.jmsMessageConverter(new MarshallingMessageConverter(jaxb2Marshaller()));
})
.destination(JmsConfig.HELLO_WORLD_QUEUE));
}
' ''