0

プログラムでリモート akka アクターを作成しています。

以下はプログラムです -

package remoting.programatic.demo

import akka.actor.{ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import remoting.config.demo.RemoteActor

object RemoteActorApp extends App {

  val system = ActorSystem("RemoteNodeApp", ConfigFactory.load().getConfig("RemoteProgrammatically"))
  val remoteActor = system.actorOf(Props[RemoteActor], name = "remoteActorAddr")

  remoteActor ! "Hello!"

  val actorSelection = system.actorSelection("akka.tcp://RemoteNodeApp@localhost:2553/user/remoteActorAddr")
  Thread.sleep(4000L)

  actorSelection ! "Hello!"

}

構成は -

RemoteProgrammatically {
  akka {
    actor {
      provider = "akka.remote.RemoteActorRefProvider"
      deployment {
        /remoteActorAddr {
          remote = "akka.tcp://RemoteNodeApp@localhost:2553"
        }
      }
    }
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        hostname = "localhost"
        port = 2553
      }
    }
  }
}

プログラムを実行した後の出力は -

[INFO] [12/27/2017 10:37:30.053] [main] [akka.remote.Remoting] Starting remoting
[INFO] [12/27/2017 10:37:30.378] [main] [akka.remote.Remoting] Remoting started; listening on addresses :[akka.tcp://RemoteNodeApp@localhost:2553]
[INFO] [12/27/2017 10:37:30.379] [main] [akka.remote.Remoting] Remoting now listens on addresses: [akka.tcp://RemoteNodeApp@localhost:2553]
[INFO] [12/27/2017 10:37:30.418] [RemoteNodeApp-akka.actor.default-dispatcher-14] [akka://RemoteNodeApp/deadLetters] Message [java.lang.String] from Actor[akka://RemoteNodeApp/user/remoteActorAddr#-766312407] to Actor[akka://RemoteNodeApp/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [12/27/2017 10:37:34.419] [RemoteNodeApp-akka.actor.default-dispatcher-14] [akka://RemoteNodeApp/deadLetters] Message [java.lang.String] from Actor[akka://RemoteNodeApp/user/remoteActorAddr#-766312407] to Actor[akka://RemoteNodeApp/deadLetters] was not delivered. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.

私が俳優に送ったメッセージは、いつも死んだ手紙に入っています。remoteActorAddrRemoteNodeApp アクター システムで正常に作成されていないようです。アクターが作成されない理由と、メッセージが常にデッド レターになる理由。ありがとう。

4

1 に答える 1

1
Message [java.lang.String] from Actor[akka://RemoteNodeApp/user/remoteActorAddr#-766312407] to Actor[akka://RemoteNodeApp/deadLetters] was not delivered. [1] dead letters encountered.

ログからの上記の抜粋は、リモート アクターから文字列メッセージを送信するときに、デッド レター メールボックスが検出されたことを示しています。リモート アクターは明らかにメッセージを に送信しています。この場合、リモート アクターが受信したメッセージはアクターの外部から( )sender()と共に送信されたため、これはデッド レターです。つまり、リモート アクター正常に作成されますが、次の 2 つのメッセージが非アクターから送信されるため、リモート アクターはデッド レターに解決されます。tell!sender()

remoteActor ! "Hello!"
...
actorSelection ! "Hello!"

ドキュメントから(強調鉱山):

actorRef ! message

アクター内から呼び出された場合、送信側のアクター参照はメッセージと共に暗黙的に渡され、sender(): ActorRefメンバー メソッドで受信側のアクターが利用できます。ターゲット アクターは、 を使用して、これを使用して元の送信者に返信できますsender() ! replyMsg

アクターではないインスタンスから呼び出された場合、送信者はdeadLettersデフォルトでアクター参照になります。

別のアクターからメッセージを送信するか、askパターンを使用します (応答を処理する内部アクターを作成します)。

于 2017-12-28T18:17:03.563 に答える