通过 RoutingDsl 创建模拟服务器后无法创建 wsClient
Cannot create wsClient after creating mock server via RoutingDsl
我正在关注 this tutorial 模拟外部网络服务:
Router router = new RoutingDsl().build();
Server server = Server.forRouter(router);
WSClient ws = WS.newClient(server.getHttpPort());
创建服务器时,启动了Akka系统。日志提到一些绑定到 127.0.0.1:2551。我相信是Akka使用的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" ]
}
如您所料,Server.fromRouter
和 WS.newClient
都创建了一个新的 Akka ActorSystem
(请注意 WS.newClient
也因此而被弃用,至少在外部测试)。
如果启用 Akka 远程处理,每个生成的系统都需要自己的端口来侦听(根据 docs)。
The port number needs to be unique for each actor system on the same
machine even if the actor systems have different names. This is
because each actor system has its own networking subsystem listening
for connections and handling messages as not to interfere with other
actor systems.
最快的解决方案是在您的 test/resources
文件夹中创建一个 application.conf
,将设置恢复到本地
akka.actor.provider = "local"
我正在关注 this tutorial 模拟外部网络服务:
Router router = new RoutingDsl().build();
Server server = Server.forRouter(router);
WSClient ws = WS.newClient(server.getHttpPort());
创建服务器时,启动了Akka系统。日志提到一些绑定到 127.0.0.1:2551。我相信是Akka使用的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" ]
}
如您所料,Server.fromRouter
和 WS.newClient
都创建了一个新的 Akka ActorSystem
(请注意 WS.newClient
也因此而被弃用,至少在外部测试)。
如果启用 Akka 远程处理,每个生成的系统都需要自己的端口来侦听(根据 docs)。
The port number needs to be unique for each actor system on the same machine even if the actor systems have different names. This is because each actor system has its own networking subsystem listening for connections and handling messages as not to interfere with other actor systems.
最快的解决方案是在您的 test/resources
文件夹中创建一个 application.conf
,将设置恢复到本地
akka.actor.provider = "local"