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.util.Iterator;
23 import java.util.Set;
24
25 import org.apache.mina.core.future.CloseFuture;
26 import org.apache.mina.core.future.IoFuture;
27 import org.apache.mina.core.future.IoFutureListener;
28 import org.apache.mina.core.service.IoService;
29 import org.apache.mina.util.ConcurrentHashSet;
30
31
32
33
34
35
36
37
38
39 public class IdleStatusChecker {
40
41
42 private final Set<AbstractIoSession> sessions = new ConcurrentHashSet<AbstractIoSession>();
43
44
45
46
47
48
49 private final NotifyingTask notifyingTask = new NotifyingTask();
50
51 private final IoFutureListener<IoFuture> sessionCloseListener = new SessionCloseListener();
52
53 public IdleStatusChecker() {
54
55 }
56
57
58
59
60
61 public void addSession(AbstractIoSession session) {
62 sessions.add(session);
63 CloseFuture closeFuture = session.getCloseFuture();
64
65
66 closeFuture.addListener(sessionCloseListener);
67 }
68
69
70
71
72
73 private void removeSession(AbstractIoSession session) {
74 sessions.remove(session);
75 }
76
77
78
79
80
81 public NotifyingTask getNotifyingTask() {
82 return notifyingTask;
83 }
84
85
86
87
88 public class NotifyingTask implements Runnable {
89 private volatile boolean cancelled;
90
91 private volatile Thread thread;
92
93
94
95 NotifyingTask() {
96
97 }
98
99 public void run() {
100 thread = Thread.currentThread();
101 try {
102 while (!cancelled) {
103
104 long currentTime = System.currentTimeMillis();
105
106 notifySessions(currentTime);
107
108 try {
109 Thread.sleep(1000);
110 } catch (InterruptedException e) {
111
112 }
113 }
114 } finally {
115 thread = null;
116 }
117 }
118
119
120
121
122 public void cancel() {
123 cancelled = true;
124 Thread thread = this.thread;
125 if (thread != null) {
126 thread.interrupt();
127 }
128 }
129
130 private void notifySessions(long currentTime) {
131 Iterator<AbstractIoSession> it = sessions.iterator();
132 while (it.hasNext()) {
133 AbstractIoSession session = it.next();
134 if (session.isConnected()) {
135 AbstractIoSession.notifyIdleSession(session, currentTime);
136 }
137 }
138 }
139 }
140
141 private class SessionCloseListener implements IoFutureListener<IoFuture> {
142
143
144
145 public SessionCloseListener() {
146 super();
147 }
148
149 public void operationComplete(IoFuture future) {
150 removeSession((AbstractIoSession) future.getSession());
151 }
152 }
153 }