Spring Integration DSL JMS入站/出站网关

时间:2016-01-29 09:55:16

标签: java spring jms spring-integration dsl

我尝试配置spring-integration以将消息发送到队列然后接收它,即非常简单的事情:

myApp -> outbound message -> jmsQueue -> inbound message -> myApp

我认为解耦所必需的是在流程的任何一端都有一个消息网关。因此,我的第一次尝试(有效)如下所示:

@MessagingGateway(name = "outboundGateway")
public interface OutboundGateway {


  @Gateway(requestChannel = OUTBOUND_CHANNEL)
  void sentMyObject(final MyObject myObject);
}


@Bean
public IntegrationFlow outboundFlow() {
   return IntegrationFlows
    .from(outboundChannel())
    .handle(Jms.outboundAdapter(connectionFactory).destination(myQueue))
    .get();
}

@Bean
public IntegrationFlow inboundFlow() {
    return IntegrationFlows.from(Jms.messageDriverChannelAdapter(connectionFactory).destination(myQueue))
     .channel(inboundChannel())
     .handle(messageReceiverHandler())
     .get();
}

其中messageReceiverHandler()是扩展AbstractMessageHandler的bean。

所以上面我们有一个消息网关用于出站消息。我假设我们应该有一个用于入站消息,允许我们将传入的消息处理与应用程序代码分离。相反,我们只是有一个扩展AbstractMessageHandler的bean,而我期待一些网关配置。什么是正确的用法?

非常感谢。

1 个答案:

答案 0 :(得分:1)

首先,您通常需要使用Jms.outboundGateway()来处理请求/回复,而不是使用两个单独的流;你可以使它适用于适配器,但它需要更多的工作,在这种情况下,它不会带来任何好处。

您可以使用:

...
.from(outboundChannel())
.handle(Jms.outboundGateway(...))
.handle("myPojo", "someMethod")
.get();

其中myPojo是包含应用程序代码的bean,其方法采用网关返回的类型。来自网关的回复转到流程中的下一个元素。

除非您有特殊要求,否则通常不建议您继承框架类。

修改

但是,这需要远程系统使用JmsReplyTo标头进行回复。此外,您的第二个处理程序的回复将转到网关(不应该有无效回复)。

对于完全异步请求/回复,您的配置是正确的,但您可以在.handle()中使用POJO。