2014-10-22 66 views
1

我有一個大任務,我分解成更小的任務並分析它們。我有一個基本的模型。如何設置Akka actor只在特定時間段運行?

主人,工人和聽衆。

大師創建任務,給他們的工人演員。一旦工人演員完成,它會要求主人完成另一項任務。一旦所有任務完成,他們都會通知聽衆。他們通常需要不到2分鐘才能完成1000個任務。

現在,有些時候某些任務所花費的時間可能比其他任務多。 我想爲每個任務設置計時器,並且如果任務需要更多時間,則工作任務應該由主人中止,並且任務必須稍後作爲新任務重新提交。如何實現這個?我可以計算一個工人任務所花費的時間,但是主人演員如何保持所有工人演員實時採用標籤時間?處理這將是每個工人

回答

0

的一種方式,在收到啓動一項任務中,設置超時改變狀態來處理任務之前,例如:

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

如果收到超時,工作人員可以中止任務(或其他任何您認爲合適的行爲 - 例如自殺,或將通知消息傳回給主人)。如果任務完成等,不要忘記取消超時(set duration = Duration.Undefined)。

+1

這隻會是一個可行的選擇,如果工人本身不做工作;基本上是對執行工作的另一個演員的輕量級代理。這樣,所有這個工作人員都會向其他參與者發出請求,然後將狀態切換爲等待響應(使用'setReceiveTimeout'在特定時間內不處理響應)。如果工作人員本身正在執行某種同步工作,那麼您無法按照您描述的方式真正打斷它,並且您將由主人管理超時。 – cmbaxter 2014-10-22 13:13:16

+0

啊,是的 - 你完全正確@cmbaxter。我將自己的回答建立在我熟悉的演員身上,他們使用這個想法,而且事實上這些演員通過協調對其他演員的呼叫來處理他們的任務。儘管如此,讓每個'工作人員'成爲一個真正的(同步)工作的兒童演員的包裝可能是可行的。 – Shadowlands 2014-10-22 13:22:38