当前位置: 首页 > 知识库问答 >
问题:

如何通过GPAR中的主参与者终止所有从属参与者?

左宁
2023-03-14

我想让我的主演员在第一个演员完成工作后立即终止所有的奴隶演员<然而,我不知道怎样才能从我的主人那里向所有的奴隶发送广播。这有函数或编程模式吗?

解决这个问题的另一种方法可能是给主人一个所有奴隶的列表,并循环通过它们,给每个奴隶发送一条终止消息,但是奴隶也需要主人作为属性,我认为这是一个问题:

import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor

class Slave extends DefaultActor {
    Actor master
    int t

    void act() {
        t = new Random().nextInt(1337)
        println "It's me, $t"
        master.send 0
    }

}

class Master extends DefaultActor {
    List slaves 

    void afterStart() {
        println "Master initialized!"
    }

    void killTheSlaves() {
        for (i in 0..slaves.size()-1){
            slaves[i].send -1
        }
    }

    void act() {
        react { int num ->
            if (num == 0)
                killTheSlaves()
        }
    }
}

def sl = new Slave().start()

def ma = new Master(slaves: [sl]).start()
sl.master = ma

此代码不编译
错误消息:

Actor线程Actor线程2 java中发生异常。lang.NullPointerException:无法在组织的null对象上调用方法send()。科德豪斯。棒极了。运行时。空对象。org上的invokeMethod(NullObject.java:91)。科德豪斯。棒极了。运行时。呼叫站点。PogoMetaClassSite。在org上调用(PogoMetaClassSite.java:48)。科德豪斯。棒极了。运行时。呼叫站点。CallSiteArray。org上的defaultCall(CallSiteArray.java:48)。科德豪斯。棒极了。运行时。呼叫站点。NullCallSite。在org上调用(NullCallSite.java:35)。科德豪斯。棒极了。运行时。呼叫站点。CallSiteArray。org上的defaultCall(CallSiteArray.java:48)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在org上调用(AbstractCallSite.java:113)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在从机上调用(AbstractCallSite.java:125)。在groovyx表演(控制台描述14:11)。GPAR。男演员默认演员。groovyx上的handleStart(DefaultActor.java:342)。GPAR。男演员AbstractLoopingActor$1。groovyx上的handleMessage(AbstractLoopingActor.java:70)。GPAR。util。AsyncMessagingCore。在java上运行(AsyncMessagingCore.java:132)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)。util。同时发生的线程池执行器$Worker。在java上运行(ThreadPoolExecutor.java:617)。朗。丝线。运行(Thread.java:745)

看来我不能在创造了奴隶后设置sl.master。

有解决办法吗?

非常感谢您的帮助<提前谢谢你!

共有1个答案

鲁浩言
2023-03-14

您应该首先设置参与者,然后启动它们:def sl=new Slave()def ma=new Master(slaves:[sl])sl.Master=ma sl.start()ma。start()

然而,你的奴隶演员在主人试图杀死他们之前就用完了他们的act()方法,所以实际上不需要杀死奴隶。

GPars在参与者身上提供了一个终止()方法来优雅地杀死他们,所以您可以考虑将您的方法更改为:vavillTheSlaves(){for(i in 0...slaves.size()-1){slaves[i]。终止() } }

 类似资料:
  • 我希望避免给终止的参与者发送死信消息,并避免向该参与者发送消息 actorSelection没有像我预期的那样工作,从ping发送的最后一条消息仍然以一纸空文告终: [信息][09/16/2016 00:47:46.237][MyActorSystem-Akka.Actor.Default-Dispatcher-4][Akka://MyActorSystem/User/PingActor/Pong

  • 我很难弄清楚我如何知道我的演员何时从非演员代码中完成。 尝试使用akka演员进行并行执行,这似乎真的很好,但我需要知道何时所有人都完成了。 我添加了一个监督者演员,产生演员来做工作,从监督者/父演员,我可以观看孩子的终止消息。 我需要从akka actor系统之外的常规java代码中得到帮助,以确定我的监督actor是否完成。 这是否可能,请提供指针。 谢谢哈瑞

  • 例如,我有两个演员——一个家长演员和一个孩子演员。当父级收到消息时,它会产生消息中指定的尽可能多的子角色。如何测试此功能?有没有一种方法可以模拟上下文,或者其他一些方法来检查参与者的创建是否正确和数量是否正确? 更新:基于@Tim answer的解决方案 更改类别: 测试:

  • 我的用例是,我想建立一个运行Akka Actors的节点集群。每个参与者都是同一参与者的实例,用于处理与特定用户的WebSocket连接。每个参与者都将使用唯一的路径注册自己。在非集群设置中,我可以简单地通过其路径调用actor,如其中,是actor实例的唯一名称。我必须将消息传递给这些参与者,这样他们才能将消息发送回各自的WebSocket客户端。 显然Akka集群提供了各种设置:http://

  • 参与者可以使用API或命令行添加到参与者库中。 在你开始之前 在你执行这些步骤之前,你在业务网络定义中必须建模一个参与者,并将其部署为业务网络。 下面的过程显示了一个使用以下数字财产范例业务网络定义的参与者模型的示例:digitalproperty-network 请注意:如果你使用composer participant add命令添加参与者,请确保参与者的JSON陈述包裹在单引号中。 name

  • ``` 所以,我的问题是--有没有一种干净的方法来结构和重构路由,而不是将它们集中在一个大的路由定义中?我也许可以创建一个参与者(路由器)的层次结构,主路由定义只是将其委托给路由器,随着我们深入参与者层次结构,我们会逐步添加更多的细节。但是否有一两种普遍接受的模式来组织路线呢?