0

メッセージがメールボックスに届くと、スケジューラはアクターを選択し、再開して OS スレッドに配置します。Java スレッドは OS スレッドにマップされて実行されます。

アクターはプールから 1 つのスレッドを使用し、このスレッドをメッセージ処理に使用して、スレッドをプールに解放します。

アクターには専用スレッドがありません。スレッドのプールがあり、アクターは割り当てられたスレッドを使用してメッセージを処理し、メッセージの処理が完了するとスレッドが解放されます。そのため、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 アクターは tell メソッドを使用してメッセージを送信します。したがって、このメッセージはメールボックス キューに入れられ、スケジューラーはキューからメッセージを選択し、メッセージでアクターを呼び出します。

メッセージが 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 に答える