1 | /* |
2 | * @(#) $Id: VmPipeIdleStatusChecker.java 332218 2005-11-10 03:52:42Z trustin $ |
3 | */ |
4 | package org.apache.mina.protocol.vmpipe; |
5 | |
6 | import java.util.IdentityHashMap; |
7 | import java.util.Iterator; |
8 | import java.util.Map; |
9 | |
10 | import org.apache.mina.common.IdleStatus; |
11 | import org.apache.mina.common.SessionConfig; |
12 | |
13 | /** |
14 | * Dectects idle sessions and fires <tt>sessionIdle</tt> events to them. |
15 | * |
16 | * @author The Apache Directory Project (dev@directory.apache.org) |
17 | * @version $Rev: 332218 $, $Date: 2005-11-10 12:52:42 +0900 $ |
18 | */ |
19 | class VmPipeIdleStatusChecker |
20 | { |
21 | static final VmPipeIdleStatusChecker INSTANCE = new VmPipeIdleStatusChecker(); |
22 | |
23 | private final Map sessions = new IdentityHashMap(); // will use as a set |
24 | |
25 | private final Worker worker = new Worker(); |
26 | |
27 | private VmPipeIdleStatusChecker() |
28 | { |
29 | worker.start(); |
30 | } |
31 | |
32 | void addSession( VmPipeSession session ) |
33 | { |
34 | synchronized( sessions ) |
35 | { |
36 | sessions.put( session, session ); |
37 | } |
38 | } |
39 | |
40 | private class Worker extends Thread |
41 | { |
42 | private Worker() |
43 | { |
44 | super( "VmPipeIdleStatusChecker" ); |
45 | setDaemon( true ); |
46 | } |
47 | |
48 | public void run() |
49 | { |
50 | for( ;; ) |
51 | { |
52 | try |
53 | { |
54 | Thread.sleep( 1000 ); |
55 | } |
56 | catch( InterruptedException e ) |
57 | { |
58 | } |
59 | |
60 | long currentTime = System.currentTimeMillis(); |
61 | |
62 | synchronized( sessions ) |
63 | { |
64 | Iterator it = sessions.keySet().iterator(); |
65 | while( it.hasNext() ) |
66 | { |
67 | VmPipeSession session = ( VmPipeSession ) it.next(); |
68 | if( !session.isConnected() ) |
69 | { |
70 | it.remove(); |
71 | } |
72 | else |
73 | { |
74 | notifyIdleSession( session, currentTime ); |
75 | } |
76 | } |
77 | } |
78 | } |
79 | } |
80 | } |
81 | |
82 | private void notifyIdleSession( VmPipeSession session, long currentTime ) |
83 | { |
84 | SessionConfig config = session.getConfig(); |
85 | |
86 | notifyIdleSession0( |
87 | session, currentTime, |
88 | config.getIdleTimeInMillis( IdleStatus.BOTH_IDLE ), |
89 | IdleStatus.BOTH_IDLE, |
90 | Math.max( session.getLastIoTime(), session.getLastIdleTime( IdleStatus.BOTH_IDLE ) ) ); |
91 | notifyIdleSession0( |
92 | session, currentTime, |
93 | config.getIdleTimeInMillis( IdleStatus.READER_IDLE ), |
94 | IdleStatus.READER_IDLE, |
95 | Math.max( session.getLastReadTime(), session.getLastIdleTime( IdleStatus.READER_IDLE ) ) ); |
96 | notifyIdleSession0( |
97 | session, currentTime, |
98 | config.getIdleTimeInMillis( IdleStatus.WRITER_IDLE ), |
99 | IdleStatus.WRITER_IDLE, |
100 | Math.max( session.getLastWriteTime(), session.getLastIdleTime( IdleStatus.WRITER_IDLE ) ) ); |
101 | } |
102 | |
103 | private void notifyIdleSession0( VmPipeSession session, long currentTime, |
104 | long idleTime, IdleStatus status, |
105 | long lastIoTime ) |
106 | { |
107 | if( idleTime > 0 && lastIoTime != 0 |
108 | && ( currentTime - lastIoTime ) >= idleTime ) |
109 | { |
110 | session.increaseIdleCount( status ); |
111 | session.getManagerFilterChain().sessionIdle( session, status ); |
112 | } |
113 | } |
114 | |
115 | } |