1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.core.session;
21
22 import java.net.SocketAddress;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.mina.util.ExpirationListener;
27 import org.apache.mina.util.ExpiringMap;
28
29
30
31
32
33
34
35
36
37
38 public class ExpiringSessionRecycler implements IoSessionRecycler {
39 private ExpiringMap<Object, IoSession> sessionMap;
40
41 private ExpiringMap<Object, IoSession>.Expirer mapExpirer;
42
43 public ExpiringSessionRecycler() {
44 this(ExpiringMap.DEFAULT_TIME_TO_LIVE);
45 }
46
47 public ExpiringSessionRecycler(int timeToLive) {
48 this(timeToLive, ExpiringMap.DEFAULT_EXPIRATION_INTERVAL);
49 }
50
51 public ExpiringSessionRecycler(int timeToLive, int expirationInterval) {
52 sessionMap = new ExpiringMap<Object, IoSession>(timeToLive,
53 expirationInterval);
54 mapExpirer = sessionMap.getExpirer();
55 sessionMap.addExpirationListener(new DefaultExpirationListener());
56 }
57
58 public void put(IoSession session) {
59 mapExpirer.startExpiringIfNotStarted();
60
61 Object key = generateKey(session);
62
63 if (!sessionMap.containsKey(key)) {
64 sessionMap.put(key, session);
65 }
66 }
67
68 public IoSession recycle(SocketAddress localAddress,
69 SocketAddress remoteAddress) {
70 return sessionMap.get(generateKey(localAddress, remoteAddress));
71 }
72
73 public void remove(IoSession session) {
74 sessionMap.remove(generateKey(session));
75 }
76
77 public void stopExpiring() {
78 mapExpirer.stopExpiring();
79 }
80
81 public int getExpirationInterval() {
82 return sessionMap.getExpirationInterval();
83 }
84
85 public int getTimeToLive() {
86 return sessionMap.getTimeToLive();
87 }
88
89 public void setExpirationInterval(int expirationInterval) {
90 sessionMap.setExpirationInterval(expirationInterval);
91 }
92
93 public void setTimeToLive(int timeToLive) {
94 sessionMap.setTimeToLive(timeToLive);
95 }
96
97 private Object generateKey(IoSession session) {
98 return generateKey(session.getLocalAddress(), session
99 .getRemoteAddress());
100 }
101
102 private Object generateKey(SocketAddress localAddress,
103 SocketAddress remoteAddress) {
104 List<SocketAddress> key = new ArrayList<SocketAddress>(2);
105 key.add(remoteAddress);
106 key.add(localAddress);
107 return key;
108 }
109
110 private class DefaultExpirationListener implements
111 ExpirationListener<IoSession> {
112 public void expired(IoSession expiredSession) {
113 expiredSession.close(true);
114 }
115 }
116 }