[ 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