【问题标题】:Supervisor strategy RESTART, doesn't actually restart my child actors?主管策略RESTART,实际上并没有重新启动我的子actors?
【发布时间】:2015-10-22 15:41:14
【问题描述】:

我有以下策略:

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

从我读到的内容(我认为我误解了),每当子演员抛出未被捕获的异常时,它就会升级到父演员。根据我上面的规则,如果我的子actor总是在接收时抛出异常,不应该重新启动10次吗?

出于某种原因,从我的日志来看,它看起来只是重新启动一次,仅此而已。我把日志放在启动前和启动后。

编辑:

我意识到自己犯了一个错误:

我使用的是“context.system.actorof()”,这就是为什么没有一个儿童演员对策略做出反应。现在我正在使用“context.actorof()”,我确实看到异常被策略“捕获”了。

对于我的子actor,它需要与 redis 交谈以获取信息,我故意关闭了我的 redis,所以子actor 将失败,现在如果我将我的主管策略设置为最多重启 10 次,我是否应该看到相同的堆栈跟踪10次​​?

我是否正确假设当子actor重新启动时,发送的相同消息会再次发送给它?

    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]

【问题讨论】:

    标签: scala akka akka-supervision


    【解决方案1】:

    是的,如果一个子演员到达maxNrOfRetries(在您的情况下为 10)在时间窗口(在您的示例中为 10 秒)内重新启动,它将被停止。

    您可以定义一个全局supervisorStrategy,例如在一些基本特征或抽象Actor 类中。在这种情况下,您所有的 Actor 类都是该 BaseActor 的子类。

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2012-11-06
      • 2016-01-23
      • 2014-04-06
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2021-05-03
      相关资源
      最近更新 更多