You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Greg Duffy (JIRA)" <ji...@apache.org> on 2006/09/07 08:56:23 UTC

[jira] Updated: (DIRMINA-162) datagram session management fails

     [ 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