Как обрабатывать коды выхода с Camel Exec? - PullRequest
0 голосов
/ 07 ноября 2018

Я использую Camel Exec для автоматического отключения на некоторых наших устройствах. Команда выключения довольно проста и в основном работает нормально:

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. Они все одного типа, так что я действительно не знаю, откуда это расхождение, но это даже не такая большая проблема. Отключение работает, тем не менее.

Проблема в том, что верблюд exec регистрирует это как ошибку:

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 не throw, поэтому я не могу исключение исключить. Он просто регистрирует ошибку, которая затем обнаруживается нашим анализом журнала. Я хотел бы обработать этот код выхода изящно, не верблюжий Exec, регистрирующий ошибку. Возвращаемое значение уже записывается отдельно в любом случае. Как я могу это сделать?

1 Ответ

0 голосов
/ 07 ноября 2018

Согласно документу 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))

вместо.

Пожалуйста, сообщите мне, может ли это быть правильным решением или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...