나는 RoundRobinPool
라우터와 OneForOneStrategy
재시작 전략을 사용하는 간단한 "hello world"배우 시스템을 보유하고 있습니다. 다음 코드는 결국 (몇 가지 실패 후) 10 "work done"
메시지를 인쇄 할 것으로 예상하지만, 실제로는 그 Worker
배우가 다시 시작되지 않는 실패한 것 같다 : 내가 잘못 뭐하는 거지OneForOneStrategy Restart가 포함 된 Akka RoundRobinPool
import java.time.LocalDateTime
import akka.actor.SupervisorStrategy._
import akka.actor.{Actor, ActorSystem, OneForOneStrategy, Props}
import akka.routing.{RoundRobinPool, RouterConfig}
import scala.concurrent.duration._
/**
* Worker Actor
*/
class Worker extends Actor {
override def receive: Receive = {
case DoIt => doit
}
def doit = {
Thread.sleep(900)
val dt = LocalDateTime.now().getSecond
if ((dt % 2) == 0) throw new Exception("Error")
else println("work done")
}
}
/**
* Message
*/
case object DoIt
/**
* Entry point
*/
object PoolHelloWorld {
def main(args: Array[String]): Unit = {
val system = ActorSystem("PoolSystem")
val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 20, withinTimeRange = 60 seconds) {
case _: Exception => Restart
}
val routerConfig: RouterConfig =
RoundRobinPool(2).withSupervisorStrategy(supervisorStrategy)
val prop: Props = Props[Worker].withRouter(routerConfig)
val worker = system.actorOf(prop, "Worker")
(1 to 10).foreach { p =>
worker ! DoIt
}
Thread.sleep(40000)
system.terminate()
}
}
?
장시간 실행되는 프로세스를 에뮬레이트하기 위해'Thread.sleep (900)'을 액터에 추가합니다. 이것이 틀린 경우, 어떻게하면 좋을까요 (장기 실행 프로세스를 에뮬레이트하는 것을 의미합니다). 그래서'DoIt' 메시지가 재전송되지 않는다면'receive' 메쏘드가 호출되지 않는다는 것을 의미합니다. 즉, Actor의 처리 로직의 호출은 항상 Actor의 메서드에서 정의 된 다음'receive' 와'postRestart' 메쏘드? –