2013-01-14 3 views
3

나는 akka 배우들 사이에서 작업자에게 일자리를 제공하는 주인을 대표하고 그 일을주의 깊게 관찰하는 메시징 프로세스를 구축하려고합니다. 그렇지 경우에도 내 질문은 내가이를 위해, 선물의 구성 제대로 할 수있는 방법을 알고 싶습니다, 선물을 가진 Akka 배우 작업과 핸드 오프

    1. 내가 합리적인 접근 방식 아래에 제안하고있어 무엇이며, 나의 미래 교육의 술. 내가 좋아하는 것

    과정이

    1) 마스터 같은이 ask와 노동자로 일을 보낸다 간다. 5 초 이내에 회신을 기다리고 있습니다. 그렇지 않으면 근로자가 기회를 잃어 버렸다고 생각하고 다시 입찰에 참가해야합니다. 노동자가 5 초 이내에 응답하지 않는 경우

    import context.dispatcher 
    implicit val timeout = Timeout(5 seconds) 
    val workCompletedFuture = (worker ? WorkTicket(work)).mapTo[Future[WorkCompleted]] 
    

    2A) 나는 자신에게 작업을 재 할당 할 수 없다는 메시지를 보내 마스터를하고 싶습니다. 노동자가 다음 응답 않은 경우

    self ! WorkAllocationFailed(work, worker) 
    

    2B) IT는 미래 [WorkCompleted] 우리에게 제공합니다. 나는 그 미래가 최대 2 분 동안 완료 될 때까지 기다리고 싶다.

    3A) 미래 [WorkCompleted] 제한 시간 내에 완료하지 못한 경우 다음 작업 미래 [WorkCompleted] 성공 후 결과를 수집하는 경우

    I

    self ! WorkFailed(work, worker) 
    

    3B)를 재 할당 이 로직을 만들려고 시도했지만 중첩 된 onComplete으로 혼란에 빠지며 Future [WorkCompleted]에서 시간 제한을 수행하는 방법을 알지 못합니다. Akka 2.10 Futures docs을 읽으려고했지만 해결책을 찾을 수 없었습니다.

  • 답변

    2

    : 당신의 작업자 배우 WorkCompleted로 응답하는 경우, 다음이 당신이 정말로 원하는 라인입니다.이 방법에 대해

    :

    1) 타임 아웃을 위해 자신에게 메시지를 예약합니다 (있는 경우) 일반 tell

    3A를 사용하여 작업자에게 작업 메시지 보내기)

    2) system.scheduler.scheduleOnce를 사용하여 완료된 작업이 시간 초과 메시지 전에 돌아오고, 예약 된 작업을 취소하고 1 단계와 2 단계를 사용하여 작업을 다시 할당하십시오.

    3b) 완료된 작업이 시간 초과 메시지 그것을 무시하거나 재 할당 된 작업을 취소하십시오.

    미래가 한 곳에서 도움이 될 수 있습니다. 특히 작업 시간이 오래 걸리거나 막히는 경우 특히 유용합니다. 작업자는 작업을 수행하고 예를 들어 작업 취소와 같이 더 많은 수신 메시지를 처리 ​​할 수 ​​있도록 미래를 사용할 수 있습니다.

    2

    작업장에 일자리를 넘기는 마스터가 있다는 것은 일반적인 생각입니다.

    한편, 시스템의 모든 부분이 이미 액터 인 경우 Futures를 사용하지 않는 것이 좋습니다. ask를 사용하여 작업을 제출하는 대신 tell을 사용하여 작업을 보낼 수 있습니다. 그런 다음 마스터는 주기적으로 시간 초과 작업을 점검하고 다시 제출할 수 있습니다.

    또한, 잠재적으로 다른 스레드에서 실행되므로 배우 몸체에서 onComplete를 호출하는 것은 매우 위험합니다. 액터와 통신하는 안전한 방법은 메시지 전달입니다. 미래가 있고 미래가 완료되었을 때 배우에서 뭔가를하고 싶다면 파이프 패턴을 사용하는 것이 좋습니다.

    스 니펫에 사소한 버그가 있습니다. - 모든 좋은 점 나는 Endre의 대답에 동의

    val workCompletedFuture = (worker ? WorkTicket(work)).mapTo[WorkCompleted] 
    
    관련 문제