Le 10/11/12 7:46 AM, Dhruv Chopra a écrit :
Hi,
I am trying to understand how MINA server does session management for UDP
clients.
Now for TCP sessions (with Nagle ON)
What for ??? Nagle algorithm is a TCP parameter, it's totally ingnored
for UDP...
, if I send multiple messages my client
in a loop I see that they often arrive in a single IoBuffer. And of course
the IoSession remains the same.
Each UDP message that arrives on the clint side will arrive in its own
IoBuffer :
private void readHandle( H handle ) throws Exception
{
IoBuffer readBuf = IoBuffer.allocate(
getSessionConfig().getReadBufferSize() );
SocketAddress remoteAddress = receive( handle, readBuf );
if ( remoteAddress != null )
{
IoSession session = newSessionWithoutLock( remoteAddress,
localAddress( handle ) );
readBuf.flip();
session.getFilterChain().fireMessageReceived( readBuf );
}
}
When I similarly send multiple messages from my UDP client - I was
expecting that a new IoSession will be created for every packet because of
the connectionless nature of the protocol and hence they will arrive in
different IoBuffers.
No, we don't create a new session for every Datagram excahned. The
session is created for a specific remote IP address and stored in a map,
so that it can be reused the next time the user send a message :
private IoSession newSessionWithoutLock( SocketAddress
remoteAddress, SocketAddress localAddress ) throws Exception
{
H handle = boundHandles.get( localAddress );
if ( handle == null )
{
throw new IllegalArgumentException( "Unknown local address:
" + localAddress );
}
IoSession session;
synchronized ( sessionRecycler )
{
session = sessionRecycler.recycle( remoteAddress );
if ( session != null )
{
return session;
}
// If a new session needs to be created.
S newSession = newSession( this, handle, remoteAddress );
getSessionRecycler().put( newSession );
session = newSession;
}
initSession( session, null, null );
try
{
this.getFilterChainBuilder().buildFilterChain(
session.getFilterChain() );
getListeners().fireSessionCreated( session );
}
catch ( Throwable t )
{
ExceptionMonitor.getInstance().exceptionCaught( t );
}
return session;
}
As you can see, if we find an existing session for a give address, we
recycle it. We then spare the cost of initializing the session (creating
the chain, etc)
In any case, this is ortogonal to the way IoBuffer are handled. One
Datagram = one IoBuffer.
However from my experiments - a datagram session
UDP session. Datagram is the data unit being transfered.
is getting closed only
after ~40 seconds and UDP messages come from the same session if sent less
than 40 sec apart.
Not sure that I get what you mean here.
Right now I am seeing that sending multiple UDP messages
come in different IoBuffers
No.
- is that guaranteed or is it possible for MINA
to accumulate them and give as one IoBuffer also?
What do you have in your chain ? Are you using a cumulative protocol
decoder ?
--
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com