On 01/28/2010 05:09 AM, jose vilmar estacio de souza wrote:
Hi all
Perhaps a stupid question, but I didn't find an answer in the examples.
I'd like to know how to shutdown a mina application in an elegant way.
Actually I kill my applications pressing ctrl+c.

What I'd like:
a: Block incoming connections.
b: Close all open sessions gracefully.
C: Finish the application.

Any ideas?
Thanks.

I did it by adding a shutdown command to the protocol. Then when the server receives the message "shutdown" it executes this:


public class ShutdownCommand extends MinaServerProtocolCommand {
...
        public ProtocolResponse execute() throws Exception {
                boolean closeImmediately = false;
                Object[] args = getArgs();
                if (args.length > 0) {
                        String closeImmediatelyStr = (String)args[0];
                        closeImmediately = 
Boolean.parseBoolean(closeImmediatelyStr);
                }
                CloseFuture closeFuture = getSession().close(closeImmediately);
                closeFuture.addListener(new CloseSessionListener());
                return null;
        }
...
        class CloseSessionListener implements IoFutureListener<CloseFuture> {
                public void operationComplete(CloseFuture future) {
                        getServer().shutDown();
                }
        }
}


getServer().shutDown() then does additional cleanup, like shutting down thread pools & timers, as well as calling out to my mina "protocol processors" telling them to shut down:


public class ProfileCacheServer implements Server {
...
        public synchronized void shutDown() {
                if (shutDown) {
                        return;
                }
                logger.info("shutting down");
                if (textProtocolProcessor != null) {
                        textProtocolProcessor.shutdown();
                }
                if (binaryProtocolProcessor != null) {
                        binaryProtocolProcessor.shutdown();
                }
                shutdownCore();
                shutDown = true;
        }

        private void shutdownCore() {
logger.debug("unregistering cache node mbean: {}", cacheNodeObjectName.toString());
                try {
                        jmxMBeanServer.unregisterMBean(cacheNodeObjectName);
                }
                catch (JMException e) {
                        logger.error("error occurred while unregistering cache node 
mbean", e);
                }

                logger.debug("shutting cache loader threads");
                cacheNode.shutdownThreads();

                logger.debug("shutting down stats timer");
                timer.cancel();
        }
...
}


And the protocol processor shutdown looks something like this:

public class ProtocolProcessor {
...
        public void shutdown() {
                if (protocolAcceptorObjectName != null) {
logger.debug("{} protocol processor unregistering protocol acceptor mbean: {}", protocolType, protocolAcceptorObjectName.toString());
                        try {
                                
jmxMBeanServer.unregisterMBean(protocolAcceptorObjectName);
                        }
                        catch (JMException e) {
logger.error("error occurred while unregistering protocol acceptor mbean", e);
                        }
                }
logger.debug("{} protocol processor shutting down server socket", protocolType);
                protocolAcceptor.unbind();
                protocolAcceptor.dispose();
        }       
...
}


(FYI - protocolAcceptor is an NioSocketAcceptor in the above.)


HTH,

DR

Reply via email to