2014-10-22 3 views
1

큰 과제가 있습니다. 작은 과제로 나누어 분석합니다. 나는 기본 모델을 가지고있다.Akka 액터를 특정 기간 동안 만 실행하도록 설정하는 방법은 무엇입니까?

마스터, 작업자 및 수신기.

마스터는 작업을 생성하여 작업자에게줍니다. 작업자가 완료되면 마스터에서 다른 작업을 요청합니다. 모든 작업이 완료되면 청취자에게 알립니다. 보통 1000 개의 작업을 완료하는 데 약 2 분이 걸리지 않습니다.

이제 일부 작업에 소요되는 시간은 다른 작업보다 더 클 수 있습니다. 각 작업에 타이머를 설정하고 작업에 더 많은 시간이 걸리면 작업자 작업이 마스터에 의해 중단되어야하며 나중에 새 작업으로 다시 제출해야합니다. 어떻게 구현하나요? 작업자가 취한 작업 시간을 계산할 수 있지만, Master 액터가 실시간으로 모든 작업자가 취한 시간에 탭을 유지하는 방법은 무엇입니까? 각 작업자 것이 처리

답변

0

한 가지 방법은,에 시작하는 작업의 영수증에, 예를 들어, 작업을 처리하기 위해 상태를 변경하기 전에 제한 시간을 설정합니다

context.setReceiveTimeout(5 minutes) // for the '5 minutes' notation - import scala.concurrent.duration._ 

타임 아웃이 수신되면

, 작업자는 작업을 중단 할 수 있습니다 (예 : 자신을 죽이거나 마스터에게 알림 메시지 전달). 작업이 완료되면 시간 초과를 취소하는 것을 잊지 마십시오 (duration = Duration.Undefined).

+1

이것은 작업자가 작업 자체를 수행하지 않는 경우에만 실행 가능한 옵션입니다. 기본적으로 작업이 수행되는 다른 액터에 대한 간단한 프록시입니다. 그런 식으로 모든 작업자는 작업을 다른 액터로 요청한 다음 상태를 응답 대기로 전환합니다 (setReceiveTimeout을 사용하여 특정 시간 내에 응답을 처리하지 않음). 작업자가 일종의 동기식 작업을 수행하는 경우에는 설명하는 방식으로 작업을 중단 할 수 없으며 마스터에서 시간 초과를 관리해야합니다. – cmbaxter

+0

아, 네 - 당신은 옳은 @cmbaxter입니다. 나는이 아이디어를 사용하는 익숙한 배우들에 대한 나의 대답을 근거로 삼았고, 실제로 그 배우들은 다른 배우들에 대한 호출을 조정함으로써 자신의 임무를 수행한다. 그럼에도 불구하고 각각의 '작업자'가 실제 (동기식) 작업을 수행하는 어린이 배우를 둘러싸고있는 일종의 래퍼 (wrapper)가되는 것은 실용적 일 수 있습니다. – Shadowlands

관련 문제