Привет, я пытался создать приложение загрузки Spring с интеграцией Spring
Приложение 1: Издатель
Jms Message -> Broker ->queue1
Приложение 2: подписчик и издатель
Broker->queue1->Transform->HTTP CALL->HTTP Response->JMS Message->Broker->queue2
Publisher Flow
@Configuration
public class EchoFlowOutBound {
@Autowired
private ConnectionFactory connectionFactory;
@Bean
public IntegrationFlow toOutboundQueueFlow() {
return IntegrationFlows.from("requestChannel")
.handle(Jms.outboundGateway(connectionFactory)
.requestDestination("amq.outbound1")).get();
}
}
//Gateway
@MessagingGateway
public interface EchoGateway {
@Gateway(requestChannel = "requestChannel")
String echo(String message);
}
Подписчики и издатели
@Configuration
public class MainOrchestrationFlow {
@Autowired
private ConnectionFactory connectionFactory;
@Autowired
private QueueChannel jmsOutChannel;
@Bean
public IntegrationFlow orchestrationFlow() {
return IntegrationFlows.from(
Jms.messageDrivenChannelAdapter(connectionFactory)
.destination("amq.outbound1")
.outputChannel(jmsOutChannel))
.<String, String>transform(s -> {
return s.toLowerCase();
})
// HTTP part goes here
.<String, HttpEntity>transform(HttpEntity::new)
.handle(
Http.outboundChannelAdapter("http://localhost:8080/uppercase")
.httpMethod(HttpMethod.POST)
.extractPayload(true)
.expectedResponseType(String.class)
)
// and here HTTP part ends
.handle(
Jms.outboundAdapter(connectionFactory)
.destination("amq.outbound2")
)
.get();
}
}
Когда я запускаю приложение, я получаю сообщение об ошибке
Caused by: org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 5000ms at org.springframework.integration.jms.JmsOutboundGateway.handleRequestMessage(JmsOutboundGateway.java:762) ~[spring-integration-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:158) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
Может кто-нибудь сказать мне, что я делаю не так,
Если HTTP-вызов выполнен и этот HTTP-вызов не завершен, но время ожидания превышает время ожидания обработчика сообщений JMS, то возникает эта проблема.
@Gimby Я тоже пробовал без http, это та же ошибка, которую я получаю




Ваша проблема в том, что ваш потребитель не request-reply. Вы получаете сообщение от amq.outbound1 и отправляете его на amq.outbound2. Вот и все: больше ничего не происходит. У вас там поток one-way.
При этом ваш производитель - request-reply - handle(Jms.outboundGateway(connectionFactory). Этот исходящий шлюз действительно ожидает ответа в заголовке ReplyTo в соответствии с параметрами по умолчанию для сценариев запроса-ответа JMS.
Итак, вы должны определить для себя: или вам нужно отправить ответ производителю, или вам просто нужно отправить и забыть от этого производителя. См. Jms.outboundAdapter() если что.
В случае запроса-ответа вам не нужен Jms.outboundAdapter() на стороне потребителя: вы должны использовать Jms.inboundGateway() вместо Jms.messageDrivenChannelAdapter().
спасибо за помощь. Это решило проблему. Я прочитал эту информацию перед тем, как сформировать ваш собственный ответ, и пропустил ее.
@Gimby Спасибо, что указали на это, не беспокойтесь об URL-адресе, я просто поставил его как фиктивный, ошибка, которую я получаю, не является http