2017-05-10 6 views
2

私は各アクタがいくつかの新しい子アクターを作成することができるAkkaアクターシステムを作成しようとしています。 例:Actor Aは200K行の入力ファイルを読み込み、の行ごとにを入力すると、そのテキスト行がActor Bに割り当てられます。Actor Bは、ビジネスロジックによってはActor Cなどを作成します。 (100行または1000行をし、派遣)読んだ後Akka&Java - デッドレターが発生しました

Message [java.lang.String] without sender to Actor[akka://My-Akka/user/$a/$b#304462457] was not delivered. [1] dead letters encountered. This logging can be turned off

エラーが開始することができ

:いくつかの時点でそのBアクターを派遣するとき、私は非一貫性行動に直面しています

は私がのエラーを取得します。すべての実行が異なります。

プログラムは、いくつかのマスタークラスで始まります:俳優Aでは

ActorSystem system = ActorSystem.create("My-Akka"); 
ActorRef actorA= system.actorOf(Props.create(ActorA.class));  
actorA.tell("some text", ActorRef.noSender()); 

私はルータを作成しています:

Router router; 
{ 
    List<Routee> routees = new ArrayList<Routee>(); 
    for (int i = 0; i < 5; i++) { 
     ActorRef r = getContext().actorOf(Props.create(ActorB.class)); 
     getContext().watch(r); 
     routees.add(new ActorRefRoutee(r)); 
    } 
    router = new Router(new RoundRobinRoutingLogic(), routees); 
} 

そして俳優AのcreateReceive関数内:

@Override 
public Receive createReceive() { 
    return receiveBuilder() 
      .match(String.class, message -> { 
         .... 
         String line; 
         while ((line = br.readLine()) != null) { 
          router.route(line, getSender()); 
         } 
        } 
       } 

      }) 
      .match(Terminated.class, message -> { 
       router = router.removeRoutee(message.actor()); 
       ActorRef r = getContext().actorOf(Props.create(ActorB.class)); 
       getContext().watch(r); 
       router = router.addRoutee(new ActorRefRoutee(r)); 
      }) 
      .build(); 
} 

アクターBのcreateReceive関数:

@Override 
public Receive createReceive() { 
    return receiveBuilder() 
      .match(String.class, s -> { 
       System.out.println("got message " + s); 
      }) 
      .matchAny(o -> logger.info("received unknown message")) 
      .build(); 
} 

私はここに何か不足していると思います。なぜなら、アクターAがデッドレターに達する前に、アクターBがアクターBに異なる数のメッセージを送信できるようになるのはなぜでしょうか。 すべての俳優が仕事をしていないうちに、マスタープログラムが終了していますか?このような場合は、何を変更する必要がありますか?

おかげ

答えて

0

問題は、特定の時間にシステムをシャットダウンし、俳優を殺してあるJunitコンテックスでプログラムを実行しているためであったように思えます。

通常モードでプログラムを実行すると、問題はなくなりました。

関連する問題