[ http://issues.apache.org/jira/browse/DIRMINA-162?page=all ]

Greg Duffy updated DIRMINA-162:
-------------------------------

    Attachment: mina-datagram-session-management.diff

Here's my first stab at fixing this. Could somebody please review it? I haven't 
touched the MINA code before just tonight :)

The attached diff is against svn revision 440993, the current trunk at this 
time.

Basically, you can implement the methods

        void sessionCreated(IoSession session);
        IoSession getSession(SocketAddress localAddress, SocketAddress 
remoteAddress);

in a ConnectionlessSessionTracker, and assign that to a DatagramSessionConfig. 
From then on, the tracker will perform session management for the transport.

The only current problem is that the session cannot be retrieved until the 
remote socket address is known. In DatagramChannel, this happen upon read, so 
the session cannot be queried for its read buffer size. I think it should still 
be the same, but once again, please review it.

Here is also a testing version of a ConnectionlessSessionTracker (don't use, it 
doesn't expire or do anything advanced enough):

import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.HashMap;
import java.util.Map;

import org.apache.mina.common.ConnectionlessSessionTracker;
import org.apache.mina.common.IoSession;

public class TestSessionTracker implements ConnectionlessSessionTracker
{
        private Map<String, IoSession> sessionMap = new HashMap<String, 
IoSession>();

        public IoSession getSession(SocketAddress localAddress, SocketAddress 
remoteAddress)
        {
                InetSocketAddress localIsa = (InetSocketAddress) localAddress;
                InetSocketAddress remoteIsa = (InetSocketAddress) remoteAddress;

                String key = new 
StringBuilder(localIsa.toString()).append(remoteIsa.toString()).toString();

                return sessionMap.get(key);
        }

        public void sessionCreated(IoSession session)
        {
                InetSocketAddress localIsa = (InetSocketAddress) 
session.getLocalAddress();
                InetSocketAddress remoteIsa = (InetSocketAddress) 
session.getRemoteAddress();

                String key = new 
StringBuilder(localIsa.toString()).append(remoteIsa.toString()).toString();

                if (!sessionMap.containsKey(key))
                {
                        sessionMap.put(key, session);
                }
        }
}

I imagine that by integrating iofilters that know of the session tracker, etc 
you could implement just about any session management strategy.

Let me know what you think!

> datagram session management fails
> ---------------------------------
>
>                 Key: DIRMINA-162
>                 URL: http://issues.apache.org/jira/browse/DIRMINA-162
>             Project: Directory MINA
>          Issue Type: Bug
>    Affects Versions: 0.9
>            Reporter: Rainer Bieniek
>            Priority: Minor
>         Attachments: mina-datagram-session-management.diff
>
>
> As of mina 0.9.0 the session management does not work in various ways:
> - a new session is created per received package. The worker thread does not 
> cache created session but only assign the select key to the session and drops 
> it after processing the package. It would be better to attach the session to 
> the RegistrationRequest and check it while processing the received package.
> - the provided IoFilterChainBuilder does get applied to the created datagram 
> session. It is cached in the RegistrationRequest but not used on the session
> - The sessionClose lifecycle event is not applied on the session either. 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to