Java 使用Spring集成和Jms将Soap消息放入队列的Web服务

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

我想使用Spring集成来公开一个简单的web服务,它将传入的消息推送到ActiveMQ并立即响应。我的解决方案是使用IntegrationFlow将连接到Jms.outboundAdapter的MarshallingWebServiceInboundGateway。下面是Gateway和IntegrationFlow片段。这个问题是适配器没有提供网关期望的响应(duh)。我从服务返回的响应为空202,延迟约为1500ms。这是由我在跟踪日志中看到的回复超时引起的:

"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])