Java 使用Spring集成和Jms将Soap消息放入队列的Web服务
我想使用Spring集成来公开一个简单的web服务,它将传入的消息推送到ActiveMQ并立即响应。我的解决方案是使用IntegrationFlow将连接到Jms.outboundAdapter的MarshallingWebServiceInboundGateway。下面是Gateway和IntegrationFlow片段。这个问题是适配器没有提供网关期望的响应(duh)。我从服务返回的响应为空202,延迟约为1500ms。这是由我在跟踪日志中看到的回复超时引起的:Java 使用Spring集成和Jms将Soap消息放入队列的Web服务,java,spring,spring-integration,spring-jms,Java,Spring,Spring Integration,Spring Jms,我想使用Spring集成来公开一个简单的web服务,它将传入的消息推送到ActiveMQ并立即响应。我的解决方案是使用IntegrationFlow将连接到Jms.outboundAdapter的MarshallingWebServiceInboundGateway。下面是Gateway和IntegrationFlow片段。这个问题是适配器没有提供网关期望的响应(duh)。我从服务返回的响应为空202,延迟约为1500ms。这是由我在跟踪日志中看到的回复超时引起的: "2020-04-14 17
"2020-04-14 17:17:50.101 TRACE 26524 --- [nio-8080-exec-6] o.s.integration.core.MessagingTemplate : Failed to receive message from channel 'org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@518ffd27' within timeout: 1000"
任何地方都没有硬性的例外。另一个问题是我自己无法生成响应。无法在适配器的.handle之后向IntegrationFlow添加任何内容
“”“逻辑和假设完全正确:单向
handle()
和类似的Jms.outboundAdapter()
后不能返回
但您的问题是,您完全错过了Spring Integration中的一个一流公民—一个MessageChannel
。重要的是要了解,即使在像您这样的流中,端点之间也有通道(DSL方法)-隐式(DirectChannel
),如您的情况,或显式:当您在两者之间使用channel()
时,可以放置任何可能的实现:
当您可以向多个订阅的端点发送相同的消息时,关键的通道实现之一是PublishSubscribeChannel
(JMS规范中的主题
):
在您的情况下,fists订阅服务器应该是您现有的单向Jms.outboundAdapter()
。另一个是生成响应并将其回复到replyChannel
头中的内容
为此,Java DSL通过子流配置提供了一个很好的挂钩:
因此,发布订阅服务器的一些示例可能如下所示:
.publishSubscribeChannel(c -> c
.subscribe(sf -> sf
.handle(Jms.outboundAdapter(this.jmsConnectionFactory))))
.handle([PRODUCE_RESPONSE])
你真是天赐之物!不过,我有一个问题。如果我理解正确的话,当您拆分流程时,您可能会进入一个糟糕的情况,即您可能无法将某些内容放到队列中,但会成功响应。你如何避免这种情况?这并不总是正确的。请参阅默认为
false的ignoreFailures
选项。只要不向PublishSubscribeSchannel
提供任何Executor
,第一个订阅服务器将阻止线程,直到它完成其工作或失败。因此,第二个订阅者只有在第一个订阅者完成并成功完成后才会执行其工作。请参阅我在答案中指出的关于PublishSubscribeChannel
的文档。
.publishSubscribeChannel(c -> c
.subscribe(sf -> sf
.handle(Jms.outboundAdapter(this.jmsConnectionFactory))))
.handle([PRODUCE_RESPONSE])