2017-12-27 326 views
0

我正在以編程方式創建遠程演員演員。創建遠程演員以編程方式不起作用

以下是節目 -

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://[email protected]:2553/user/remoteActorAddr") 
    Thread.sleep(4000L) 

    actorSelection ! "Hello!" 

} 

的配置 -

RemoteProgrammatically { 
    akka { 
    actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
     deployment { 
     /remoteActorAddr { 
      remote = "akka.tcp://[email protected]: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://[email protected]:2553] 
[INFO] [12/27/2017 10:37:30.379] [main] [akka.remote.Remoting] Remoting now listens on addresses: [akka.tcp://[email protected]: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'. 

我發送到演員的消息始終進入死信。 看起來像remoteActorAddr未在RemoteNodeApp參與者系統上成功創建。 任何想法爲什麼演員沒有創建,爲什麼消息總是進入死信。 謝謝。

回答

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(),在這種情況下,這是一個死信,因爲遠程演員收到的消息是從演員外部以tell!)發送的。換句話說,遠程演員成功創建,但以下兩個消息是從非演員,這會導致sender()遠程演員來解決死字母發送:

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

documentation(重點煤礦):

actorRef ! message 

如果一個演員內調用,然後對這個角色的參考將被隱隨消息一起傳遞的d可用於接收Actor的sender(): ActorRef成員方法。目標演員可以使用這個來回復原始發件人,使用sender() ! replyMsg

如果從不是Actor的實例調用,發件人將默認爲deadLetters actor參考。

從另一個演員發送消息,或使用ask圖案(其創建內部演員來處理答覆)。

相關問題