【问题标题】:Spring Integration Jms.outboundGateway x FirewallsSpring 集成 Jms.outboundGateway x 防火墙
【发布时间】:2020-12-18 14:56:02
【问题描述】:

当网络防火墙打开时,以下流程可以正常工作,但是如果我们关闭它并且无法访问 JMS 代理,则根本不会发生超时并且调用者进程会卡住。网关计时器似乎没有启动,因为线程没有返回......你能建议处理这种不愉快情况的最佳方法是什么吗?

@Bean
public IntegrationFlow request() {
  return IntegrationFlows.from(requestChannel)
                               .handle(Jms.outboundGateway(this.connectionFactyory)
                               .requestDestination(requestQueue)
                               .extractReplyPayload(false)
                               .correlationKey("JMSCorrelationID")
                               .receiveTimeout(5000L))
                               .channel(replyChannel).get();
}

【问题讨论】:

    标签: spring-integration spring-integration-dsl


    【解决方案1】:

    见receiveTimeoutJavaDocs:

    /**
     * Set the max timeout value for the MessageConsumer's receive call when
     * waiting for a reply. The default value is 5 seconds.
     * @param receiveTimeout The receive timeout.
     */
    public void setReceiveTimeout(long receiveTimeout) {
    

    所以,它实际上是关于一个 reply,当我们已经发送了一个 request 时会触发它。更重要的是,您肯定会使用默认的 5 秒作为其值。所以,阻塞问题在其他地方。

    如果您与我们分享org.springframework.integration 的一些 DEBUG(甚至是 TRACE)日志,以了解在没有 JMS 代理访问权限的情况下向流发送消息时发生了什么,那就太好了。

    【讨论】:

    • 感谢您的及时回复。我在 DEBUG/TRACE 级别进行了检查,但没有任何相关内容。我同意请求者应该超时,但无论如何我发现这种情况很奇怪。让我知道您是否需要更多信息或有任何其他想法。
    • 您可能需要查看 JMS 提供者的客户端文档来设置连接超时。如果防火墙只是丢掉SYN包,客户端就会卡住;进行线程转储以查看发生了什么。
    • 谢谢大家,我会仔细看看。
    • 男士们,为了进一步测试这个场景,我添加了一个 MessagingGateway 来触发上述集成流,将消息推送到 requestChannel。即使在 MessagingGateway/Gateway 级别(位于集成流程的顶部)设置请求/回复超时,也不会发生超时。很可能是因为主线程没有返回?使用弹性客户端调用集成流程即可解决,并且问题不会存在。我想知道在集成流程中添加“任务执行器”是否会有所帮助。不确定这是否可行。有什么建议吗?
    • 问题是,我想在集成流程本身中处理这种情况,因为我无法控制客户端。假设我有一个 REST API,它将在请求触发集成流的位置公开。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多