2015-10-22 2 views
1

У меня есть ниже Страт:Стратегия супервайзера RESTART, фактически не перезапускает моих дочерних актеров?

override val supervisorStrategy = OneForOneStrategy(10, 10.seconds) { 
    case e: JedisConnectionException => Restart 
    case e: Exception => Restart 
    } 

Из того, что я прочитал (который я думаю, что я недопонимание) всякий раз, когда ребенок актер бросает исключение, разве перехвачена, он перерос в родительском актера. Основываясь на правиле, которое у меня выше, если мой ребенок-актер всегда бросает исключение на прием, не нужно ли его перезапускать 10 раз?

По какой-то причине, из моих журналов, похоже, что он просто перезагружает один раз и все. Я поставил журналы в предварительном и постстарте.

EDIT:

я понял одну ошибку, которую я делал:

Я использовал «context.system.actorof()» вот почему никто из детей актеров не реагируют на Strat. Теперь я использую «context.actorof()», и я вижу, что исключения были «пойманы» стратом.

Для моего ребенка-актера ему нужно поговорить с redis для информации, и я намеренно закрыл свой redis, чтобы ребенок-актер потерпел неудачу, теперь, если я установил, что мой диспетчер начнет перезагружаться до 10 раз, должен ли я видеть то же самое stacktrace 10 раз?

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

2015-10-22 15:31:17,747 - [error] a.a.OneForOneStrategy - Error occurred trying to check for item existing in Redis: 
java.lang.RuntimeException: Error occurred trying to check for item existing in Redis: 
    at services.impl.RedisStatusServiceImpl.exists(RedisStatusServiceImpl.scala:62) ~[classes/:na] 
    at w.c.Poller$$anonfun$process$1.apply(Poller.scala:64) ~[classes/:na] 
    at w.c.Poller$$anonfun$process$1.apply(Poller.scala:58) ~[classes/:na] 
    at scala.collection.immutable.List.foreach(List.scala:381) ~[scala-library-2.11.7.jar:na] 
    at w.c.Poller.process(Poller.scala:58) ~[classes/:na] 
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 
    at redis.clients.util.Pool.getResource(Pool.java:50) ~[jedis-2.7.3.jar:na] 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99) ~[jedis-2.7.3.jar:na] 
    at services.impl.RedisStatusServiceImpl.exists(RedisStatusServiceImpl.scala:58) ~[classes/:na] 
    at w.c.Poller$$anonfun$process$1.apply(Poller.scala:64) ~[classes/:na] 
    at w.c.Poller$$anonfun$process$1.apply(Poller.scala:58) ~[classes/:na] 
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused 
    at redis.clients.jedis.Connection.connect(Connection.java:164) ~[jedis-2.7.3.jar:na] 
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:82) ~[jedis-2.7.3.jar:na] 
    at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1641) ~[jedis-2.7.3.jar:na] 
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:85) ~[jedis-2.7.3.jar:na] 
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861) ~[commons-pool2-2.3.jar:2.3] 
Caused by: java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_05] 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) ~[na:1.8.0_05] 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_05] 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_05] 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_05] 

ответ

2

Да, если ребенок актер достиг maxNrOfRetries (в вашем случае 10) перезапускается в течение временного окна (10 секунд в вашем примере), он будет остановлен.

Вы можете определить глобальный supervisorStrategy, например, в базовом признаке или абстрактном классе Actor. Все классы вашего актора в этом случае являются подклассами этого BaseActor.

+0

ive обновленный оп. – iCodeLikeImDrunk

Смежные вопросы