我正在关注this tutorial模仿外部网络服务:
Router router = new RoutingDsl().build();
Server server = Server.forRouter(router);
WSClient ws = WS.newClient(server.getHttpPort());
创建服务器时,Akka系统启动。日志提到一些绑定到127.0.0.1:2551。我相信这是Akty使用的Netty。
当我创建WS客户端时,某些服务(我相信Netty)也会尝试绑定到同一个地址并使用address already in use
失败。
我尝试在application.conf中重新配置我的Akka.remote以使用不同的端口,但这两种服务似乎都在为同一个端口而战。
如何让服务器和WS客户端同时实例化?
谢谢。
更新 - 提供了application.conf(省略了注释和空对象)
appName = myApplication
akka {
log-config-on-start = true
actor {
provider = "cluster"
}
actor-system = ${appName}
cluster {
metrics {
enabled = off
native-library-extract-folder = ${user.dir}/target/native
}
pub-sub {
name = distributedPubSubMediator
role = ""
routing-logic = broadcast
gossip-interval = 1s
removed-time-to-live = 120s
max-delta-elements = 3000
use-dispatcher = ""
}
seed-nodes = [
"akka.tcp://"${appName}"@127.0.0.1:2551"
]
}
extensions = [
"akka.cluster.metrics.ClusterMetricsExtension",
"akka.cluster.pubsub.DistributedPubSub"
]
remote {
log-remote-lifecycle-events = on
enabled-transports = ["akka.remote.netty.tcp"] # needed ?
netty.tcp {
hostname = "127.0.0.1"
port = 3551
}
}
}
play.crypto.secret = "mySecret"
play.modules {
enabled += libs.clients.playaero.Module
enabled += libs.clients.playelastic.Module
enabled += libs.clients.playfacebook.Module
enabled += controller.akka.Module
enabled += model.Module
enabled += settings.Module
}
play.i18n {
langs = [ "en" ]
}
答案 0 :(得分:1)
正如您所预料的那样,Server.fromRouter
和WS.newClient
都会创建一个新的Akka ActorSystem
(请注意WS.newClient
也因此而被弃用,至少在测试之外
如果启用了Akka远程处理,则每个衍生系统都需要自己的端口来监听(按照docs)。
端口号对于每个actor系统必须是唯一的 机器,即使演员系统有不同的名称。这是 因为每个actor系统都有自己的网络子系统监听 连接和处理消息,以免干扰他人 演员系统。
最快的解决方案是在application.conf
文件夹中创建test/resources
,将设置恢复到本地
akka.actor.provider = "local"