我想创建一个简单的单例集群并从远程节点发送消息

时间:2017-08-06 04:46:30

标签: akka akka-http akka-cluster

这里我创建了一个单身演员。主节点和种子节点是相同的。从我尝试添加到群集中的另一个项目,并希望发送消息。我能够加入群集但无法发送消息。

我的主节点和种子节点:

     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://DemoMain1@127.0.0.1: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://DemoMain1@127.0.0.1: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
     }

尝试加入群集并发送消息的另一个节点。

<script type="text/javascript" src="//code.jquery.com/jquery-1.8.3.js"></script>
<textarea style="height: 300px;"></textarea>
<p id="preview"></p>        
<script type="text/javascript">
setInterval(function() {
    $('#preview').html($('textarea').val());
}, 10);
</script>

如果我提供系统的IP地址,那么也不会发送消息。

1 个答案:

答案 0 :(得分:0)

您的role演员的ClusterSingletonProxySettings(system).withRole("slave")设置中的Ping似乎与您ClusterSingletonManagerSettings(system).withRole(role) role = "test"的{​​{1}}不匹配。

ClusterSingletonProxy应该出现在设置了群集的指定role的所有节点上,因此其role设置应与ClusterSingletonManager匹配。这是一个sample configuration