Che*_*rry 8 java jvm scala remote-actors akka
我在一个JVM中使用HelloActor启动了akka系统,并尝试从另一个JVM中的客户端向其发送消息.什么都行不通.我应该如何正确地做到这一点?这是代码:
简单服务器
package akkaSample.severalSystems
import akka.actor.{Props, Actor, ActorSystem}
import com.typesafe.config.ConfigFactory
class HelloActor extends Actor {
override def preStart(): Unit = {
println("Hello actor started")
}
def receive = {
case "mew" => println("I said mew")
case "hello" => println("hello back at you")
case "shutdown" => context.stop(self)
case _ => println("huh?")
}
}
object Server extends App {
val root = ConfigFactory.load()
val one = root.getConfig("systemOne")
val system = ActorSystem("HelloSystem", one)
val helloActor = system.actorOf(Props[HelloActor], "HelloActor")
println (system)
println("Remote application started.")
}
Run Code Online (Sandbox Code Playgroud)
简单客户端
package akkaSample.severalSystems.client
import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import scala.util.control.Breaks._
class Client {
}
object Client extends App {
println("started")
val root = ConfigFactory.load()
val two = root.getConfig("systemTwo")
val system = ActorSystem("mySystem", two)
//What should be there to access HelloActor?
val selection = ...
selection ! "mew"
println(selection.anchorPath)
}
Run Code Online (Sandbox Code Playgroud)
配置文件
systemOne {
akka {
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
port = 2552
}
}
}
}
systemTwo {
akka {
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
port = 2553
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它假设Server在Client之前启动.现在我收到"akka:// mySystem/deadLetters"(println(selection.anchorPath))时试图让演员这样system.actorSelection("akka://HelloSystem@127.0.0.1:2552/HelloActor")
那么如何在另一个JVM中从ActorSystem中检索actor呢?或者直到我创建一个集群,指定种子,领导等等,这是不可能的?
您似乎错过了在配置中添加RemoteActorRefProvider.您的actor配置应如下所示:
systemOne {
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
port = 2552
}
}
}
}
systemTwo {
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
port = 2553
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
演员选择是使用完成的
context.actorSelection("akka.tcp://actorSystemName@10.0.0.1:2552/user/actorName")
Run Code Online (Sandbox Code Playgroud)
您无需创建Akka群集即可启用远程处理功能.
此配置更改RemoteActorRefProvider需要akka-remote作为依赖项.
| 归档时间: |
|
| 查看次数: |
1688 次 |
| 最近记录: |