通过RoutingDsl创建模拟服务器后无法创建wsClient

时间:2016-12-29 08:13:16

标签: playframework playframework-2.0

我正在关注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" ]
}

1 个答案:

答案 0 :(得分:1)

正如您所预料的那样,Server.fromRouterWS.newClient都会创建一个新的Akka ActorSystem(请注意WS.newClient也因此而被弃用,至少在测试之外

如果启用了Akka远程处理,则每个衍生系统都需要自己的端口来监听(按照docs)。

  

端口号对于每个actor系统必须是唯一的   机器,即使演员系统有不同的名称。这是   因为每个actor系统都有自己的网络子系统监听   连接和处理消息,以免干扰他人   演员系统。

最快的解决方案是在application.conf文件夹中创建test/resources,将设置恢复到本地

akka.actor.provider = "local"