2015-11-26 8 views
5

アクターの「グレースフルストップ」を俳優のために勉強し、それをテストするための小さなテストアプリを作成しました。優雅な停止の後、常にアクターの名前を再使用することはできません

アプリケーションは、「正常な停止」はhttp://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop に言及したことを示していますが正常に再利用することができ常に保証は俳優の名前を停止しません。

毎日のようにして、次の例外が表示されます。

Exception in thread "main" akka.actor.InvalidActorNameException: actor name [DummyActor] is not unique! 

それはなぜですか? InvalidActorNameExceptionsが毎回表示されないようにアプリを修正するにはどうすればよいですか?

メインクラス...

import akka.actor._ 
import akka.pattern.gracefulStop 
import DummyActor.Stop 
import DummyActor 

import scala.concurrent.duration._ 
import scala.concurrent.{Await, Future} 

object AkkaTest { 
    def main(args: Array[String]) { 

    val actorsystem = ActorSystem("testSystem") 

    1 to 5 foreach { _ => 

     // Create an actor with name: DummyActor 
     val dummyActor = actorsystem.actorOf(Props[DummyActor], "DummyActor") 

     // Gracefully stop the DummyActor 
     val stopped: Future[Boolean] = gracefulStop(dummyActor, 5 seconds, Stop) 
     Await.result(stopped, 6 seconds) 
    } 

    val terminated: Future[Terminated] = actorsystem.terminate() 
    Await.result(terminated, 10 seconds) 

    System.out.println("Finished successfully. Try again, eventually it will fail. You can also increase the amount of loops.") 
    } 
} 

と俳優の...

import akka.actor.Actor 
import DummyActor.Stop 

object DummyActor { 
    case object Stop 
} 

class DummyActor extends Actor { 

    override def receive: Receive = { 
    case Stop => context stop self 
    } 

} 

私はスカラ座2.11.7およびJava 8とアッカにあります。ここでは

コードです2.4.0。

+3

に同名を開始します。 警告俳優停止し、その名前が登録解除されていることに留意してください は非同期的に起こる別のイベントです互いに。したがって、gracefulStop()が返された後に、まだ使用中の名前が見つかることがあります。適切な登録解除を保証するには、管理している管理者の名前を再利用するだけで、終了したメッセージに応じて、つまり最上位の俳優には返信しないでください。 スーパーバイザーの俳優を作って、「Terminated」受信時にのみ名前を付ける – Odomontois

答えて

7

称賛はそうawfullの書式を持って、私はここに

それをコピーします、私はちょうどここにリンクをたどっと赤色の警告を見つけ

警告俳優が停止していることを覚えておいてください は、互いに非同期に発生する別々のイベントです。 したがって、 gracefulStop()が返された後に、まだ使用中の名前が見つかることがあります。適切な の登録抹消を保証するには、 を管理し、Terminatedというメッセージに応答してのみ、つまりトップレベルの 俳優ではない管理者の名前を再利用してください。

ですから、ここに添付してリンクをたどっスーパーバイザ俳優を作るだけTerminated受信

関連する問題