首页 > 解决方案 > 如何强制停止 Apache Camel 交换?

问题描述

我正在使用camel-exec组件执行一些外部进程。

这些可能会长期运行(或出于任何商业原因),我希望能够根据某些标头值杀死一些 inflightExchanges。

到目前为止,一切都很好。我可以过滤我想杀死的交换,我用 . 标记交换e.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);并将其从InfightRepository.

但我需要的是强制停止当前任务的执行,并阻止交换进一步路由。

你会提出什么建议?有任何想法吗?

标签: apache-camel

解决方案


我为解决它所做的如下:

  • 创建了两个缓存 anexecCommandCache<aKey, org.apache.camel.component.exec.ExecCommand>和 a processCache<org.apache.camel.component.exec.ExecCommand, java.lang.Process>。每当启动一个新的可执行文件时,我都会将它添加到这些缓存中。

  • 当我需要取消可执行文件时,我正在浏览 InflightRepository 并过滤aKeyExchange 标头。然后我ExecCommandexecCommandCacheand 中检索 并且通过这个我可以找到实际Process的 from processCache

  • 最后我使用 Zeroturnaroundzt-process-killer来杀死Process. 并通过以下方式将交换标记为已完成exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);

    ProcessUtil.destroyGracefullyOrForcefullyAndWait(process, 5, TimeUnit.SECONDS, 5, TimeUnit.SECONDS);
    

它不是很干净,但可以解决问题。希望能帮助到你。


推荐阅读