The sessions are closed in the session handler when it receives the
terminate session ack from the server:

/* (non-Javadoc)
     * @see 
org.apache.mina.common.IoHandlerAdapter#messageReceived(org.apache.mina.common.IoSession,
java.lang.Object)
     */
    @Override
    public void messageReceived(IoSession session, Object message)
throws Exception
    {
        LOG.info("Message Received: MESSAGE={}", message);

        AbstractSessionMessage msg = (AbstractSessionMessage) message;
        MessageType messageType = msg.getType();

        // Handle message
        switch (messageType)
        {
       <snip>
        case TERMINATE_SESSION_ACK:
            handleTerminateSessionAckMessage(session);
            break;
       <snip>
        default:
            LOG.error("Received unexpected message: {}",msg);
            session.close();
            break;
        }
    }

private void handleTerminateSessionAckMessage(IoSession session)
    {
        // Error if we aren't idle
        if (! (session.getAttachment() == ClientSessionState.SESSION_STARTED))
        {
            LOG.error("Received terminate session ack in wrong state:
STATE={}", session.getAttachment());
            session.close();
            return;
        }

        session.setAttachment(ClientSessionState.SESSION_TERMINATED);

        // Ba-bye
        session.close();
    }

    /* (non-Javadoc)
     * @see 
org.apache.mina.common.IoHandlerAdapter#sessionClosed(org.apache.mina.common.IoSession)
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception
    {
        LOG.info("Session closed: {}", session.getRemoteAddress());
    }

I know that this is happening because the logs show it...

I/c*.i*.c*.c*.g*.ClientS*(  274): Message Received:
MESSAGE=com.<removed>.message.terminatesessionackmess...@43e564a8[messagetype=terminate_session_ack(0xc)]
I/c*.i*.c*.c*.g*.ClientS*(  274): Session closed: 0.0.0.0/0.0.0.0:0

We only run one session at a time (guaranteed by using a single thread
pool scheduled executor):

executorService = Executors.newSingleThreadScheduledExecutor();

These sessions are run once per minute:

executorService.scheduleAtFixedRate(new
GatewayClientRunner(gatewayClient), 60, 60, TimeUnit.SECONDS);

The client runner:

public class GatewayClientRunner implements Runnable
{
    private GatewayClient client;

    public GatewayClientRunner(GatewayClient client)
    {
        this.client = client;
    }

    /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    public void run()
    {
        try
        {
            client.run();
        }
        catch (Throwable t)
        {
            LOG.error("Error running client", t);
        }
    }
}

client.run() is the run() method shown below that makes the connection
with the socketconnector...


On Sat, Sep 18, 2010 at 9:10 AM, Emmanuel Lecharny <[email protected]> wrote:
>  On 9/18/10 6:00 PM, Charles Hudak wrote:
>>
>> I'm using MINA 1.1.7 on android (2.2 emulator) to connect to my MINA
>> server implementation.
>>
>> My client runner looks like this:
>>
>> public void init() {
>>
>>         connector = new SocketConnector();
>>         connectorConfig = new SocketConnectorConfig();
>>
>> connectorConfig.setConnectTimeout(SOCKET_CONNECT_TIMEOUT_IN_SECONDS);
>>         connector.setWorkerTimeout(WORKER_THREAD_TIMEOUT_IN_SECONDS);
>>         connectorConfig.getFilterChain().addLast("codec", new
>> ProtocolCodecFilter(getCodecFactory()));
>>     }
>>
>>     public void run() {
>>
>>         try {
>>             LOG.info("connecting to gateway host={}, port{}", host, port);
>>             ConnectFuture connectFuture = connector.connect(
>>                     new InetSocketAddress(host, port),
>>                     clientSessionHandler, connectorConfig);
>>             connectFuture.join(CONNECT_JOIN_TIMEOUT_IN_MS);
>>             IoSession session = connectFuture.getSession();
>>             LOG.debug("Connected: {}", session.getLocalAddress());
>>             CloseFuture closeFuture = session.getCloseFuture();
>>             closeFuture.join();
>>
>>             LOG.debug("Session complete: {}", session.getLocalAddress());
>>
>>         } catch (Exception e) {
>>             LOG.error("unable to initiate session", e);
>>         } finally {
>>         }
>>     }
>>
>> The client is run using a ScheduledExecutorService and runs every
>> minute to connect to the server and do a message exchange. After
>> running for some period of time I get this:
>
> Do you ever close the sessions you are opening ? How many of them are you
> opening ?
>
>
> --
> Regards,
> Cordialement,
> Emmanuel Lécharny
> www.iktek.com
>
>

Reply via email to