【问题标题】:Akka start and access actors returned dataAkka 启动和访问 actor 返回的数据
【发布时间】:2015-06-11 23:30:53
【问题描述】:

我有演员MainActor,它初始化并为另外两个子发送消息,并期望得到一个结果。所以MainActor 有两个儿童演员SubActorASubActorB

基本上我想在子参与者的数据到达时建立一个模型,我可以在更高级别的某个地方访问它(初始化MainActor的类)

例如,我有 100 毫秒的时间来完成这两项任务。如果SubActorA 已在 70 毫秒内返回数据,但SubActorB 需要更多时间,则它将多 30 毫秒,并且所有任务都将被放弃,但我仍然对数据感兴趣并希望访问它,即使其中一些子任务已超时。

问题:

  1. 如何将整个执行时间限制为 100 毫秒,以便将来能够访问每个参与者的部分数据?

  2. 如何从最高级别的参与者访问数据?我不能一直通过从UntypedActor 扩展并将消息发送到更高级别来一次又一次地将数据推送到更高级别。我试图创建一个WrapperHandler,它将初始化MainActor,但不幸的是得到异常You have to use one of the 'actorOf' factory methods to create a new actor. 当然我可以使用actorOf 方法并调用.tell() 方法来向启动所有工作。但是,如果我不再扩展 UntypedActor 并且不再覆盖 onRecieve() 方法,我该如何获得回复?

感谢您的帮助!

【问题讨论】:

    标签: java akka


    【解决方案1】:

    Akka 中的一切都基于消息传递。如果你想从一个actor那里获取数据,你需要它(发送一条消息),然后这个actor(也许)会回复(发送另一条消息)。

    幸运的是,Akka 提供了一个名为 ask 的助手,它可以让您从参与者外部发送消息并以 Future 的形式接收回复。您通过 ask helper 从您的 actor 层次结构之外(或您实例化 MainActor 的任何位置)向您的 MainActor 发送一条消息,MainActor 将回复您的数据。

    http://doc.akka.io/docs/akka/2.3.9/java/untyped-actors.html#Ask__Send-And-Receive-Future

    【讨论】:

    • 非常感谢!我的MainActor 应该回复谁?我正在尝试回复getContext().parent().tell(message, getSelf());,但它因超时而失败。你知道可能的原因吗?
    • 您必须回复发件人。
    • 但是自从MainActor 收到来自SubActorA 的当前消息(它想在actor 之外转发),据我了解,对发件人的引用会产生无限循环?
    • 我的意思是你不能依赖sender(),如果你有一个以上的层次结构,因为一个actor可能同时收到来自不同SubActor的许多消息。您可以通过构造函数传递侦听器,但在这种情况下,如何在演员世界之外返回答案?
    • 您索要数据并立即返回给sender()。如果该数据在您的层次结构中向下几个级别,那么您必须在每个级别询问或使用forward
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多