2017-08-06 10 views
0

ここではシングルトンアクタを作成しました。マスターノードとシードノードは同じです。私はクラスタに追加しようとしている別のプロジェクトから、メッセージを送信したい。クラスタに参加することはできますが、メッセージを送信することはできません。シンプルなシングルトンクラスタを作成し、リモートノードからメッセージを送信したい

私のマスターとシードノード:

 package Demo 
    import akka.actor._ 
    import akka.cluster.singleton.{ClusterSingletonManager, ClusterSingletonManagerSettings, ClusterSingletonProxy, ClusterSingletonProxySettings} 
    import com.typesafe.config.ConfigFactory 
    import scala.concurrent.duration._ 
    object MainObject1 extends App{ 
    DemoMain1.start(8888) 

    } 
    object DemoMain1 { 
     val role = "test" 
     val singletonname = "Ruuner" 
     val mastername = "Master" 
     def start(port: Int): ActorSystem = { 
     val conf = ConfigFactory.parseString(
      s""" 
    |akka.actor.provider = "akka.cluster.ClusterActorRefProvider" 
    | 
    |akka.remote.netty.tcp.port = $port 
    |akka.remote.netty.tcp.hostname = 127.0.0.1 
    |akka.cluster.roles = ["$role"] 
    |akka.cluster.seed-nodes = ["akka.tcp://[email protected]:8888"] 

    """.stripMargin 
) 
val system = ActorSystem("DemoMain1", conf) 
val settings = ClusterSingletonManagerSettings(system).withRole(role) 
val manager = ClusterSingletonManager.props(Props[DemoMain1], PoisonPill, settings) 
val actor=system.actorOf(manager, mastername) 
system 
     } 

     class DemoMain1 extends Actor with Identification { 
     import context._ 
     override def preStart(): Unit = { 
      println(s"Master is created with id $id in $system") 
      println(self.path.address.host) 
      system.scheduler.scheduleOnce(100.seconds, self, 'exit) 

     } 

     override def receive : Receive={ 
    case 'exit => println("$id is exiting") 
    context stop self 
    //SupervisorStrategy.Restart 


    case msg => println(s"messasge from $system is $msg ") 

     sender() ! 'how 
     } 
     } 
    } 

クラスタに参加して、メッセージを送信しようとしている他のノード。

 import akka.actor._ 
    import akka.cluster.singleton.{ClusterSingletonProxy, ClusterSingletonProxySettings} 
    import com.typesafe.config.ConfigFactory 
    import scala.concurrent.duration._ 
    object Ping extends App{ 
     def ping: ActorSystem = { 
     val conf = ConfigFactory.parseString(
      s""" 
       |akka.actor.provider = "akka.cluster.ClusterActorRefProvider" 
    | 
    |akka.remote.netty.tcp.port = 0 
    |akka.remote.netty.tcp.hostname = 127.0.0.1 
    |akka.cluster.roles = ["slave"] 
    |akka.cluster.seed-nodes = ["akka.tcp://[email protected]:8888"] 
    |akka.cluster.auto-down-unreachable-after = 10s 
    """.stripMargin 
) 
val system = ActorSystem("DemoMain1", conf) 
system.actorOf(Props[Ping]) 
system 
     } 
     class Ping extends Actor { 
     import context._ 
     val path = "akka.tcp://[email protected]:8888/DemoMain1/user/Master/actor" 
     val settings = ClusterSingletonProxySettings(system).withRole("slave") 
     val actor = context.actorOf(ClusterSingletonProxy.props(path, settings)) 
     val pingInterval = 1.seconds 
     override def preStart(): Unit = { 
      system.scheduler.schedule(pingInterval, pingInterval) { 
      println(s"Locate Ping $system") 
      actor ! 'hi 
      } 
     } 

     override def receive: Receive = { 
      case msg => println(s"The message is $msg") 

     } 
     } 
     Ping.ping 
    } 

私がシステムのIPアドレスを与えると、メッセージも送信されません。

答えて

0

あなたPing俳優がrole = "test"あなたClusterSingletonManagerSettings(system).withRole(role)のものと一致しないのは、あなたのClusterSingletonProxySettings(system).withRole("slave")設定でroleを表示されます。

ClusterSingletonProxyはしたがってそのrole設定がClusterSingletonManager年代と一致している必要があり、クラスタが設定されている指定roleを持つすべてのノード上に存在することになっています。 sample configurationです

+0

同じ名前をつけてみましたが、動作しません –

関連する問題