我有两个独立的应用程序在ActiveMQ代理的任一侧运行;应用程序1向应用程序2发送同步请求,将响应返回给应用程序1.目前,回复是通过临时队列进行的,我现在正在尝试创建一个命名的回复目标,以避免创建多个临时队列的开销。
申请1
@MessagingGateway
public interface OrderGateway {
@Gateway(requestChannel = "requestChannel", replyChannel = "responseChannel")
public OrderDto fetchOrder(OrderRequest orderRequest);
}
@Bean
public IntegrationFlow outgoingRequestFlow(ConnectionFactory connectionFactory) {
return IntegrationFlows.from("requestChannel")
.handle(Jms.outboundGateway(connectionFactory)
.requestDestination("request.queue")
.replyDestination("response.topic")
.correlationKey("JMSCorrelationID"))
.channel("responseChannel")
.get();
}
申请2
@Bean
public IntegrationFlow incomingRequestFlow(ConnectionFactory connectionFactory) {
return IntegrationFlows.from(Jms.inboundGateway(connectionFactory)
.destination("request.queue")
.correlationKey("JMSCorrelationID"))
.channel("requestChannel")
.handle("requestServiceActivator", "handleRequest")
.channel("responseChannel")
.get();
}
@Component
public class OrderServiceActivator {
@Autowired
OrderService orderService;
@ServiceActivator
public OrderDto fetchOrder(OrderRequest orderRequest) {
return orderService.getById(orderRequest.getId());
}
}
当我启动两个应用程序时request.queue
被创建并且有一个消费者(应用程序2)。 response.topic
被创建但由于某种原因它没有消费者。因此,当我向应用程序1发送请求时,它到达应用程序2,但是在5秒之后,应用程序1没有收到回复并且超时并且记录了以下错误:
申请2
org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'org.springframework.web.context.WebApplicationContext:/application-2.responseChannel'
申请1
org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 5000ms
我认为我已经做了一些简单的配置错误,任何帮助都会受到赞赏。
答案 0 :(得分:0)
我未能找到@ServiceActivator如何接线...
通常情况如下:
@ServiceActivator(inputChannel = "requestChannel", outputChannel = "responseChannel")
public .....
也许这就是你所缺少的。
答案 1 :(得分:0)
使用您的配置,回复队列没有长期使用者 - 为每个请求创建一个使用者(使用特定相关ID的消息选择器)。
如果您添加.replyContainer()
,则会有永久消费者。
但是,它在功能上应该没有区别。
我只是使用和不使用replyContainer()
进行类似于你的测试,这对我来说都很好......
@Bean
public IntegrationFlow jmsOutboundGatewayFlow() {
return f -> f.handleWithAdapter(a ->
a.jmsGateway(this.jmsConnectionFactory)
// .replyContainer()
.replyDestination("pipereplies")
.correlationKey("JmsCorrelationID")
.requestDestination("jmsPipelineTest"));
}
我建议你打开调试日志记录,看看是否会有所帮助。
@Bean
public IntegrationFlow jmsInboundGatewayFlow() {
return IntegrationFlows.from((MessagingGateways g) ->
g.jms(this.jmsConnectionFactory)
.correlationKey("JmsCorrelationID")
.destination("jmsPipelineTest"))
.<String, String>transform(String::toUpperCase)
.get();
}