2013-04-12 3 views
0

В соответствии с Аккой 2.10 моя конфигурация регистрации сбрасывается во время выключения ... в результате чего потенциально важные сообщения записываются на стандартный вывод, а не на механизм ведения журнала.Сбой регистрации Akka во время выключения

Например, этот код:

String settings = 
     "akka.event-handlers = [\"akka.event.slf4j.Slf4jEventHandler\"]\n" + 
     "akka.actor.provider = \"akka.cluster.ClusterActorRefProvider\""; 
Config config = ConfigFactory.parseString(settings); 
ActorSystem system = ActorSystem.create("testing", config); 
LoggingAdapter log = Logging.getLogger(system, new Object()); 
log.info("Via SlF4J"); 
system.shutdown(); 
Thread.sleep(1000); 
log.info("After shutdown"); 

производит этот выход:

17:24:11.999 [testing-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jEventHandler - Slf4jEventHandler started 
17:24:12.151 [testing-akka.actor.default-dispatcher-4] INFO N.168.1.106:2552) - [email protected]://[email protected]:2552 
17:24:12.155 [testing-akka.actor.default-dispatcher-4] INFO java.lang.Object - Via SlF4J 
[INFO] [04/12/2013 17:24:12.218] [testing-akka.actor.default-dispatcher-4] [NettyRemoteTransport(akka://[email protected]:2552)] [email protected]://[email protected]:2552 
[INFO] [04/12/2013 17:24:13.156] [main] [Object(akka://testing)] After shutdown 

Первые три строки вывода через SLF4J (мой настроен регистратор), в то время как последние два могут с помощью akka.event.Logging$StandardOutLogger - это означает, что исключения, регистрируемые во время выключения (и я вижу несколько, в некоторых случаях), теряются для регистратора.

(Было бы хорошо, чтобы увидеть сообщение RemoteServerShutdown вошли правильно, конечно.)

Кто-нибудь есть какие-либо понять в этом поведении?

ответ

0

Эта проблема, по-видимому, решена путем перехода на Akka 2.10-2.1.2.

1

Заготовка Akka основана на актерах, и, естественно, поскольку все актеры закрыты в течение ActorSystem.shutdown(), она должна перестать работать в какой-то момент. Резервное копирование в консольное ведение журнала было введено в действие, так что сообщения, которые были зарегистрированы в последнее время, все еще не полностью потеряны.

Что вы видите, так это то, что ваш log.info иногда приходит раньше, а иногда и после момента, когда регистрация завершается, поскольку ActorSystem.shutdown() просто инициирует выключение, которое затем выполняется асинхронно.

Таким образом, вывод заключается в том, что ведение журнала через систему актеров должно выполняться только внутри системы актеров, поскольку это гарантирует, что все еще работает и работает.

+0

Благодарим вас - и я согласен с тем, что вы говорите, но проблема в том, что Akka регистрирует * свои собственные * сообщения (некорректно) после выключения (например, «RemoteServerShutdown»). Мой «log.info» был добавлен только для подтверждения того, что изменение ведения журнала связано с синхронизацией. (Мне не нужно регистрировать такое сообщение, но у меня есть необходимость, чтобы Akka правильно регистрировала его!) – Tim