Java 播放框架:重新编译后Netty无法绑定
我正在使用Akka和Memcached在Play框架中进行一个项目。当我在IDE中更改java源代码时,play会自动重新编译和重新运行/重新加载。在我们的项目中,有一个代码为Akka寻找一个自由港。4万开始。尝试打开和关闭端口上的套接字。成功后,它将为Akka构建一个配置,包括找到的可用端口。但稍后此初始化失败并引发此异常:Java 播放框架:重新编译后Netty无法绑定,java,scala,playframework,akka,Java,Scala,Playframework,Akka,我正在使用Akka和Memcached在Play框架中进行一个项目。当我在IDE中更改java源代码时,play会自动重新编译和重新运行/重新加载。在我们的项目中,有一个代码为Akka寻找一个自由港。4万开始。尝试打开和关闭端口上的套接字。成功后,它将为Akka构建一个配置,包括找到的可用端口。但稍后此初始化失败并引发此异常: Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /127.0.0.1:4
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /127.0.0.1:40000
at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)
at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:377)
at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:374)
at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)
at scala.util.Try$.apply(Try.scala:161)
at scala.util.Success.map(Try.scala:206)
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59)
at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72)
at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:344)
at sun.nio.ch.Net.bind(Net.java:336)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:199)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:366)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:290)
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
奇怪的是,这段代码可以在Ubuntu上运行,但不能在MacOSX(Maverics)上运行。任何想法都是非常好的。您希望现有实例通过什么机制释放其端口?请尝试在终端中使用
sudo lsof-i4
,以确定是否有人正在接管有问题的端口。看起来您的旧实例仍在运行,因此它仍保留端口。我不是此项目的架构师。我想深入研究一下,但我没有时间。但可以肯定的是,这在ubuntu上正常工作。它只在OSX上失败。此外,我调试了初始化代码,在AKKA/NETTY启动之前,这个端口是免费的。问题在AKKA或Netty启动期间明显出现。