通过 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.fromRouterWS.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"