- ポート 9000 を使用して、Jetty サーバーを使用するアプリケーションを起動します。
- 次に、Ctrl-C でアプリケーションをシャットダウンします
- 「netstat -a」で確認すると、ポート 9000 が使用されていないことがわかります。
- アプリケーションを再起動すると、次のようになります。
[ERROR,9/19 15:31:08] java.net.BindException: Only one usage of each socket address (protocol/network address/port) is normally permitted [TRACE,9/19 15:31:08] java.net.BindException: Only one usage of each socket address (protocol/network address/port) is normally permitted [TRACE,9/19 15:31:08] at java.net.PlainSocketImpl.convertSocketExceptionToIOException(PlainSocketImpl.java:75) [TRACE,9/19 15:31:08] at sun.nio.ch.Net.bind(Net.java:101) [TRACE,9/19 15:31:08] at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126) [TRACE,9/19 15:31:08] at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:77) [TRACE,9/19 15:31:08] at org.mortbay.jetty.nio.BlockingChannelConnector.open(BlockingChannelConnector.java:73) [TRACE,9/19 15:31:08] at org.mortbay.jetty.AbstractConnector.doStart(AbstractConnector.java:285) [TRACE,9/19 15:31:08] at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) [TRACE,9/19 15:31:08] at org.mortbay.jetty.Server.doStart(Server.java:233) [TRACE,9/19 15:31:08] at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) [TRACE,9/19 15:31:08] at ...
これはJavaのバグですか?Jetty サーバーを起動する前にどうにかして回避できますか?
編集 #1 BlockingChannelConnector を作成するためのコードを次に示します。「setReuseAddress(true)」に注意してください。
connector.setReuseAddress( true ); connector.setPort( port ); connector.setStatsOn( true ); connector.setMaxIdleTime( 30000 ); connector.setLowResourceMaxIdleTime( 30000 ); connector.setAcceptQueueSize( maxRequests ); connector.setName( "Blocking-IO Connector, bound to host " + connector.getHost() );
アイドル時間と何か関係があるのでしょうか?
編集 #2役立つかもしれないし、役に立たないかもしれないパズルの次のピース: アプリケーションをデバッグモード (Eclipse) で実行すると、サーバーは問題なく起動します!!! ただし、上記の問題は、アプリケーションを実行モードで実行する場合、またはビルドされた jar ファイルとして実行する場合に再現可能に発生します。ウィスキー タンゴ フォックストロット?
編集 #3 (4 日後) - まだ問題があります。何かご意見は?