簡體   English   中英

阿卡:在兒童演員結束后停止演員

[英]Akka: Stop actor after child actors are finished

我經常發現自己使用了一個“主”角色,為子任務創建了許多子角色。 當子任務完成后,主要演員也應該停止自己。 因此,當context.children.isEmpty時,我會觀察子演員並停止主演員。

我經常使用這種模式,但我從未讀過這個。 我不確定,如果這是一個好主意,或者如果失敗的演員有問題......?

我已經閱讀過Akka 2中的關閉模式 ,但這種方法在Java中似乎比我的解決方案更復雜?

這是我的主代碼的偽代碼,有兩個子任務:

class MainActor extends AbstractActor {

    public MainActor() {
        receive(ReceiveBuilder
                .match(SubTask1Response.class, this::handleSubTask1)
                .match(SubTask2Response.class, this::handleSubTask2)
                .match(Terminated.class, x -> checkFinished())
                .build());
    }

    @Override
    public void preStart() throws Exception {
        context().watch(context().actorOf(SubTask1Worker.props(), "subTask1"));
        context().watch(context().actorOf(SubTask2Worker.props(), "subTask2"));
    }

    private void checkFinished() {
        if(context().children().isEmpty()) {
            context().stop(self());
        }
    }

    // ...
}

(我必須使用Java 8 :-(,但如果你能提供另一種解決方案,我也很樂意閱讀Scala代碼)

所以context().children().isEmpty()似乎按預期工作。

但是在調試我的Akka應用程序時,我發現了這種方法的另一個問題:當Terminated消息到達MainActor時,它不是確定性的:有時在示例中的SubTask1Response 之前Terminated消息!

我現在改變了我的代碼來自己計算正在運行的子節點,並在MainActor收到結果響應SubTask[1,2]Response時減少數量。

=>所以我不推薦我原來的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM