I have a rather annoying problem in my server application.
I bind Apache Mina with the following code:
acceptor.bind(new InetSocketAddress(PORT));
Where acceptor is an NioSocketAcceptor. Over a HTTP interface I can shutdown the server so I can restart it.
Server.ioAcceptor.unbind(new InetSocketAddress(Server.PORT));
for(IoSession session: Server.ioAcceptor.getManagedSessions().values()){
if(session.isConnected() && !session.isClosing()){
session.close(false);
}
}
Server.ioAcceptor.dispose();
Main.transport.stop();
Logger.getRootLogger().warn("System going down. Request from "+context.getRemoteAddress());
System.exit(10);
This is the code I use to stop the Mina server. However if I try to start the server again in the next couple of minutes. (Somewhere between 5 minutes and 15 minutes) I get the following exception on start up: java.net.BindException: Address already in use
I also tried a simple ioAcceptor.unbind() but there was no difference. The server runs on Centos 5 with OpenJDK. Apache Mina version is 2.0 RC1.
Thank you in advance for any ideas on how to resolve this.
I'm not sure of the root cause, but I read somewhere a fix for this that seems to work for me:
acceptor.setReuseAddress(true);
Simply adding that let me shutdown and restart
A couple things I would add:
acceptor.setReuseAddress(true)
session.close(false)
use session.close(true)
This will close the session immediately instead of waiting for a flush.References:
Session close - http://mina.apache.org/report/trunk/apidocs/org/apache/mina/core/session/IoSession.html#close(boolean)
ServerSocket reuse address - http://download.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html?is-external=true#setReuseAddress(boolean)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With