【问题标题】:Spring integration Automatic Shutdown弹簧集成自动关机
【发布时间】:2016-05-23 10:27:33
【问题描述】:

完成所有文件的所有进程后,如何在 spring 集成中创建自动关闭?我的应用程序使用大量文件作为输入并使用 http 出站网关作为最后一个端点,因此我对每个文件输入都有 http 出站请求,并且我尝试使用来自该端点的最后一个 http 响应作为关闭的触发器(context.close ()) 弹簧集成。我的想法是尝试使用 (System.currentTime()-lastTimeGatewayResponse)>= idleTime 作为触发器。但我没有找到从该网关获取 lastTimeGatewayResponse 的方法。

然后我尝试关注http://forum.spring.io/forum/spring-projects/integration/116366-orderly-shutdown-how-to-know-when-downstream-executor-is-idle。但我认为这不是最好的方法,因为我的应用程序在进程未完成时关闭了。

有人有这方面的经验吗?

谢谢

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    如果您使用的是 4.2.x(当前版本为 4.2.6),您可以在回复频道拨打channel.getTimeSinceLastSend()

    javadocs 说它以秒为单位,但这是不正确的,它是毫秒。

    【讨论】:

      【解决方案2】:

      嗯,实际上lastTimeGatewayResponse 可能完全等同于该网关上reply-channel 中的timeSinceLastSend

      因此,您可以将 nullChannel 指定为您的 http 出站网关的 output (reply-channel) 并跟踪其 timeSinceLastSend 以执行您的关闭逻辑。

      另一方面,尝试使用<aggregator> 完成类似但更稳健的行为。您可以将correlationKey 用作所有文件的静态内容,并作为<aggregator> 的输入操作触发关闭。发布策略可能是你输入文件的数量。

      【讨论】:

      • 我们可以从主类入口点(我们调用context.xml的地方)调用“lastTimeGatewayResponse/timeSinceLastSend”吗?还是应该在端点内调用?在您的建议中是在 中,如果我这样做,如何调用 context.close()?提前致谢。
      • 你能给我举个例子吗?谢谢。很抱歉提出了很多要求。
      • 好吧,如果是main,通常它会在上下文刷新后立即停止,因为没有什么可以阻止该主线程。无论如何,您可以访问timeSinceLastSend 属性,从该上下文中获取MessageChannel bean。您应该定期执行此操作或作为每个文件进程的附带事件的问题。只是因为你需要在最后一个之后有idle time
      • 您可以将一些 POJO 服务注入聚合器并从那里执行`context.close()`。
      • 感谢 Artem,实际上我了解使用 pojo 的聚合器,我不明白的部分是如何在其中调用 context.stop,顺便说一句,如果我在我的聚合器上使用 System.exit() 是否可以保存停止春天?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多