我正在使用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不会不抛出,所以我也没有例外。它只是记录错误,然后由我们的日志分析将其记录下来。 我想在没有骆驼执行记录错误的情况下优雅地处理该退出代码。无论如何,返回值已经单独记录。我怎样才能做到这一点?
答案 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))
相反。
请告诉我这是否可以解决问题。