Spring Integration DSL JMS 入站/出站网关
Posted
技术标签:
【中文标题】Spring Integration DSL JMS 入站/出站网关【英文标题】:Spring Integration DSL JMS Inbound/Outbound Gateways 【发布时间】: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,而我希望有一些网关配置。正确的用法是什么?
非常感谢您。
【问题讨论】:
【参考方案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 请提供更新代码和解决方案以上是关于Spring Integration DSL JMS 入站/出站网关的主要内容,如果未能解决你的问题,请参考以下文章
Spring Integration DSL:PublishSubscribeChannel 订单
Spring Integration DSL JMS 入站/出站网关