【发布时间】:2018-01-25 11:51:03
【问题描述】:
我有一个在应用程序启动时作为另一个actor 的子级创建的actor,并且每天从父级接收一条消息,以执行从某个SFTP 服务器获取一些文件的操作。
现在,可能有一些小的临时连接异常会导致操作失败。在这种情况下,需要重试。
但在某些情况下,可能会抛出异常并且不会在重试时解决(例如:找不到文件、某些配置不正确等)
因此,在这种情况下,考虑到参与者将在很长一段时间后(每天一次)收到消息,什么可能是合适的重试机制和监督策略。
在这种情况下,发送给actor的消息并不是错误的输入——它只是一个触发器。示例:
case object FileFetch
如果我在父母中有这样的监督策略,它将在每个次要/主要异常上重新启动失败的孩子而不重试。
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = -1, withinTimeRange = Duration.inf) {
case _: Exception => Restart
}
我想要的是这样的:
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = -1, withinTimeRange = Duration.inf) {
case _: MinorException => Retry same message 2, 3 times and then Restart
case _: Exception => Restart
}
【问题讨论】:
标签: scala akka actor akka-supervision akka-actor