2017-05-11 11 views
0

子アクターから親にメッセージを送信できません。 私は、Java 8 &アッカ2.5.1Akkaの親はその子からメッセージを受け取っていません

マスター親がIMPLクラスで作成されて使用しています:

public Receive createReceive() { 
    return receiveBuilder() 
     .match(Object_B_Message.class, message -> { 
        ActorRef objectB= context().actorOf(Props.create(ObjectB.class)); 
        objectB.tell(message, this.getSelf()); 
    }) 
     .match(Object_C_message.class, message -> {      
        ActorRef objectC = context().actorOf(Props.create(ObjectC.class)); 
        objectC.tell(message, this.getSelf()); 
    }) 

I:

ActorSystem system = ActorSystem.create("My-Akka"); 
ActorRef master = system.actorOf(Props.create(Master.class)); 
master.tell(new Object_B_Message(), ActorRef.noSender()); 

マスタークラスは実装を受け取り、次のしていますObjectBがメッセージを受け入れ、何かを行い、object_C_messageをマスターに送信してObjectCをアクティブにします。

私はオブジェクトBを起動することができますが、object_c_messageを送信しようとすると、それはどこにも行き渡らず、マスターはそれを受信して​​いないようです。ここ

はObjectBにのコードである:

public Receive createReceive() { 
return receiveBuilder() 
    .match(Object_B_message.class, message -> { 

、コードの次の行のどれがマスターにメッセージを送信することができなかった:

ActorRef ref = getContext().parent(); 
this.getSelf().tell(object_c_message, this.getSelf()); 
ref.tell(object_c_message, getSender()); 
ref.tell(object_c_message, ActorRef.noSender()); 
ref.tell(object_c_message, this.getSender()); 
ref.tell(object_c_message, ref); 
ref.tell(object_c_message, context().parent()); 
ref.tell(object_c_message, this.getSelf()); 

アッカプリントコンソールに以下アプリケーションを終了する前に10回メッセージ:

[akka://My-Akka/user/$a/$f] Message [object_c_message] from Actor[akka://My-Akka/user/$a/$f#-489049040] to Actor[akka://My-Akka/user/$a/$f#-489049040] was not delivered. [1] dead letters encountered. This logging can be turned off...'. 

私はちょうどeは正しく配線され、私は直接使うobject_C_messageとマスターを呼ぶことができたとマスターはC.

任意のヘルプ

感謝のメッセージとアクティブ化オブジェクトを得ました。

答えて

0

あなたの行を見てみましょう。

最初に、object_c_messageの作成方法を示していません。私はあなたが正しいことをやっていると思います。

ActorRef ref = getContext().parent(); 

これまでのところ、とても良いです。ただし、ユーザーはgetSender()とすることができます。

  1. this.getSelf().tell(object_c_message, this.getSelf()); これは間違っています。あなたは自分にメッセージを送ります。

  2. ref.tell(object_c_message, getSender());これは半分間違っています。現在の送信者(あなたの親でもある)に代わって、親にというメッセージを送信しています。

  3. ref.tell(object_c_message, ActorRef.noSender());また、間違っています。それはあなたの親に送信されますが、親は応答することができません。

  4. ref.tell(object_c_message, this.getSender());これは、これは、このシナリオでは、REF == getSender()以来4に相当する1

  5. ref.tell(object_c_message, ref);で複製されます。

  6. ref.tell(object_c_message, context().parent());これは、このシナリオのRef == getSender()以降2と同等です。

  7. ref.tell(object_c_message, this.getSelf());入手しました!これはあなたが使用できる正しいものです。あるいは、getSendert().tell(object_c_message, getSelf());も同様です。

なぜそれが機能しないのですか?知るか。 getSender()とgetSelf()とrefの値を調べながら、より多くのロギングステートメントを追加して、あなたのIDEでデバッグしてみてください。あなたは正しいオブジェクトを作成していないかもしれませんし、マスターの受信で未処理/死んだ手紙に行きます。あなたのログがdeadlettersメッセージを受信/送信している俳優と言うだろうので、あなたが行うことができます

もう一つは、代わりにアッカの、あなたの俳優の名前に作成時にある分かりやすい名前を生成し(context.actorOf(DemoActor.props(42), "name");

これらの事を行います

+0

こんにちは@Diego Martinoia。ありがとうございました。アクターに名前を追加し、ideのデバッグモードで実行しようとしました。 '[CoordinatedShutdown(akka:// My-Akka)] JVMシャットダウンフックからコーディネートされたシャットダウンを開始しています 私は何とか私のマスターがメッセージを子どもに送信した直後にシャットダウンしているので、マスターに電話しようとしているときにもう利用できないと感じています。 –

+1

@ t-rex-50おそらく、あなたの「メイン」が終了していて、JVMが終了し、それを持つAsystemが終了します。あなたのメインコードを投稿してください。 –

関連する問題