【问题标题】:Spring integration asynchronous communication synchronous responseSpring集成异步通信同步响应
【发布时间】:2014-12-20 09:00:32
【问题描述】:

我目前有一个入站 https 网关。在对来自 http 网关的请求的内部处理中,我调用了多个 http web 服务。目前,当我从调试点监视时,如果我从发布-订阅通道调用 4 个 Web 服务,它们将一个接一个地执行。然后在 4 个服务被一个一个调用之后,它们被聚合并返回一个响应。这里的问题是可能有 N 次调用,所以本质上可能只有 2 个 http Web 服务调用,甚至可能有 100 个。为了解决这个问题,我在发布 subsce 通道中添加了一个任务执行器关注

<int:publish-subscribe-channel id="ta-htl-data-router-channel" apply-sequence="true" task-executor="pool" />

<task:executor id="pool" pool-size="10"/>

然后,当 web 路由器通道订阅者同步执行时,http 入站网关停止正常工作,即我收到以下错误消息

Reply message received but the receiving thread has already received a reply

我得到一个响应 json 字符串来下载,而不是在浏览器中显示为响应。

如何异步调用多个外部 Web 服务并将聚合响应发送到 http 入站网关。因此,虽然整个 http 入站网关请求到响应是同步发生的,但内部多个外部 Web 服务的调用却是异步发生的,以减少处理时间。

【问题讨论】:

    标签: java multithreading spring asynchronous spring-integration


    【解决方案1】:

    考虑在您的&lt;task:executor&gt; 上使用rejection-policy="CALLER_RUNS"。

    问题可能在于那些long-running 调用网络服务,如果你有超过10 个并发任务,所有其他的将默认为ABROTED。

    【讨论】:

    • 另一个注意事项是每个http请求我最多有10个并发任务吗?或者,如果我收到 20 个并发入站 http 请求,那么他们必须使用相同的 10 个线程的线程池
    • 如何将每个任务执行器设为十个线程,或者在不可能的情况下,选择线程池编号的最佳实践或准则是什么。此外,当整个线程池用完时,我将如何防止其他执行尝试被中止,而是让它们强制线程池释放然后
    • 看我的回答:rejection-policy="CALLER_RUNS" 是最好的妥协。无论如何,根据传入的请求缩放拉取大小是不好的。您的 CPU 和并发线程之间应该有健康的妥协。
    【解决方案2】:

    您需要添加一个&lt;aggregator/&gt; 来将结果组合成一个列表,然后添加一些转换器来从结果中构造响应;根据reply-timeout,原来的http线程会等待结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2014-06-29
      • 2019-01-14
      • 2015-08-03
      相关资源
      最近更新 更多