使用Spring Integration为请求/响应创建命名的回复目标

时间:2015-09-21 22:10:49

标签: java spring spring-integration

我有两个独立的应用程序在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

我认为我已经做了一些简单的配置错误,任何帮助都会受到赞赏。

2 个答案:

答案 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();
}