0

当消息进入邮箱时,调度程序选择一个演员,恢复它并将其放在操作系统线程上。Java 线程与 OS 线程映射以执行执行。

Actor 将使用池中的一个线程并使用该线程进行消息处理并将线程释放到池中。

Actor 没有专用线程。有一个线程池,参与者将使用分配的线程来处理消息,一旦消息处理完成,线程将被释放。因此,Actor 与线程解耦。

现在让我们举个例子:

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            String sRmsg = (String) message;
            businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
        }
    }
}


ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell("Charlie Parker");

在这里,greeter actor 使用 tell 方法发送消息,因此该消息将进入邮箱队列,调度程序将从队列中选择消息并使用该消息调用 actor。

当在 GreetingActor 的 'onReceive' 方法中接收到消息时-我的问题是演员使用的线程何时会被释放回池中-在 onReceive 方法中接收消息之后还是在执行 collectdata() 方法之后?

另外,“消息处理”表示什么?

4

1 回答 1

0
businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion

如果这条线可能会花费那么多时间,那么它应该被视为阻塞调用。文档中有一节解释了如何安全处理此类情况:

http://doc.akka.io/docs/akka/2.1.0/general/actor-systems.html#blocking-needs-careful-management

当在 GreetingActor 的 'onReceive' 方法中接收到消息时-我的问题是演员使用的线程何时会被释放回池中-在 onReceive 方法中接收消息之后还是在执行 collectdata() 方法之后?

它会在执行 long collectdata() 调用后将线程“释放”回池中——因此上面的代码很危险。

我在上面粘贴的链接有一些很好的模式如何解决这个问题,如果你不能将任务分成更小的部分(例如,因为你使用了一个你无法控制的外部库)。

如果您可以将该方法拆分为更细粒度的短时任务,由参与者处理和消息传递,那么您不需要特殊处理。

-Endre,
Akka 团队

于 2013-02-20T11:45:12.937 回答