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
>
>