我是新手Akka开发者,我刚开始使用远程处理。我总是看到这种配置:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
deployment {
"/mainRepository/*" {
remote = "akka.tcp://MqttRemote@127.0.0.1:2553"
}
}
}
remote {
netty.tcp {
hostname = "127.0.0.1"
}
}
remote.netty.tcp.port = 2553
}
其中actor被命名,例如" mainRepository"但是,如果我想创建未命名的远程演员怎么办?我应该在配置中指定什么?或者我可以通过在请求新演员时不在ActorSystem中设置name参数来实现这一目标吗?
此外," *"性格的意思?或者我在哪里可以了解有关远程配置的更多信息? (除了akka.io)
答案 0 :(得分:1)
这个配置说的是,如果在路径/user/mainRepository/*
下创建了任何actor实例(也就是说,绑定到名称/user/mainRepository
的actor实例的任何子节点)都不应该部署到本地ActorSystem
但应使用远程系统MqttRemote@127.0.0.1:2553
的远程守护程序在该远程系统中部署此actor。所以,如果我做了类似的事情:
context.actorOf(Props[MyActor], "foo")
如果context
是我的ActorContext
actor实例的mainRepository
,那么该子项将被远程部署。
*
是一个通配符,可让您更加了解远程部署的演员。如果配置是这样的:
"/mainRepository/foo" {
remote = "akka.tcp://MqttRemote@127.0.0.1:2553"
}
然后,只会远程部署绑定到名称foo
的子项。我的mainRepository
演员的任何其他孩子都将被部署到本地ActorSystem
。
因此,使用这种方法,使用通配符,您确实可以创建未命名的子节点并远程部署它们,只要它们的父节点已正确命名并且配置了该名称(如本例所示)即可部署它。孩子们远程。
如果使用此配置驱动方法对您没有吸引力,您还可以以编程方式远程部署actor实例。这看起来像这样:
import akka.actor.{ Props, Deploy, Address, AddressFromURIString }
import akka.remote.RemoteScope
val address = Address("akka.tcp", "RemoteSystem", "1.2.3.4", 1234)
val ref = system.actorOf(Props[MyActor].
withDeploy(Deploy(scope = RemoteScope(address))))
在上面的代码中,MyActor的一个实例将部署在远程节点RemoteSystem@1.2.3.4:1234
上。
有关详细信息,请参阅远程处理文档here。