【问题标题】:Spring Integration DSL JMS Inbound/Outbound GatewaysSpring Integration DSL JMS 入站/出站网关
【发布时间】:2016-05-07 00:15:04
【问题描述】:

我正在尝试配置 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,而我希望有一些网关配置。正确的用法是什么?

非常感谢您。

【问题讨论】:

    标签: java spring jms spring-integration dsl


    【解决方案1】:

    首先,您通常需要使用Jms.outboundGateway() 进行请求/回复消息传递,而不是两个单独的流程;你可以让它与适配器一起工作,但它需要更多的工作,在这种情况下,它不会提供任何好处。

    你可以使用:

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

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

    一般不建议你继承框架类,除非你有特殊要求。

    编辑

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

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

    【讨论】:

    • 非常感谢加里的回复。我显然对这应该如何工作感到有些困惑。实施您的建议会产生:“ org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 5000ms” 大概是因为我的发送方法没有返回任何内容。网关方法现在应该返回 myObject 吗?为什么会这样,因为我希望这是异步的。
    • 啊 - 抱歉 - 我没有注意到您的网关返回了 void。如果你想完全异步,你的原始代码是正确的(例外你可以使用 POJO 来回复)。
    • 感谢 Gary,很高兴看到您在 Spring Integration 方面帮助人们。我怀疑这不会是我的最后一个问题!
    • 没问题;如果它解决了您的问题,这里习惯上“接受”一个答案(单击投票计数器下方的勾号/复选标记)。它将帮助其他人搜索问题/答案。
    • @deanpullen coudl 请提供更新代码和解决方案
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多