如何使用Camel Exec处理退出代码?

时间:2018-11-07 10:29:26

标签: apache-camel

我正在使用Camel Exec在某些设备上自动关机。 shutdown命令非常简单,并且通常可以正常工作:

from(START_DEEP_SLEEP)
                .setBody(constant(null)) // we don't want stdin for exec
                .setHeader(ExecBinding.EXEC_COMMAND_ARGS, constant("""shutdown $shutdownDelay "starting deep sleep shutdown" """))
                .to("exec:sudo")

很显然,此命令将关闭发送到执行它的应用程序。除了有时会产生143的退出值外,这也不是什么大问题。我知道返回值的含义,在这里看到它是有意义的,但这仅在某些设备上发生。大多数其他人只是返回0。它们都是相同的类型,因此我真的不知道这种差异来自何处,但是这甚至不是什么大问题。关闭仍然有效。

问题是骆驼高管将其记录为错误:

ERROR 549 --- [Camel (camel-1) thread #1 - seda://start-deepsleep] o.a.camel.component.exec.ExecProducer : The command ExecCommand [args=[shutdown, now, starting deep sleep shutdown], executable=sudo, timeout=9223372036854775807, outFile=null, workingDir=null, useStderrOnEmptyStdout=false] returned exit value 143 

这会在我们的监视中产生不希望的噪音,我宁愿不记录下来。

这里的核心问题是Camel Exec不会抛出,所以我也没有例外。它只是记录错误,然后由我们的日志分析将其记录下来。 我想在没有骆驼执行记录错误的情况下优雅地处理该退出代码。无论如何,返回值已经单独记录。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

根据文档http://camel.apache.org/exec.html,有一个标头ExecBinding.EXEC_EXIT_VALUE填充有错误号。您应该是143(文档提示这取决于操作系统)。

这可能是处理日志条目的“钩子”,例如删除具有相同错误号的最后一个条目。 当然,这只是一个外观修复。实现可能是这样的:

from(START_DEEP_SLEEP)
   .setBody(constant(null)) // we don't want stdin for exec
   .setHeader(ExecBinding.EXEC_COMMAND_ARGS, constant("""shutdown $shutdownDelay "starting deep sleep shutdown" """))
   .to("exec:sudo")
   .when(header(ExecBinding.EXEC_EXIT_VALUE))
   .to("direct:edit_the_log")

请注意,我没有测试该代码。也许您使用

访问该标头
.when(header(EXEC_EXIT_VALUE))

相反。

请告诉我这是否可以解决问题。