View Javadoc

1   /*
2    * @(#) $Id: VmPipeIdleStatusChecker.java 210062 2005-07-11 03:52:38Z 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 Trustin Lee (trustin@apache.org)
17   * @version $Rev: 210062 $, $Date: 2005-07-11 12:52:38 +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                              long idleTime;
75                              SessionConfig config = session.getConfig();
76  
77                              if( !session.isIdle( IdleStatus.BOTH_IDLE ) )
78                              {
79                                  idleTime = config
80                                          .getIdleTimeInMillis( IdleStatus.BOTH_IDLE );
81                                  session.setIdle( IdleStatus.BOTH_IDLE,
82                                                   idleTime > 0L
83                                                   && ( currentTime - session.getLastIoTime() ) > idleTime );
84                                  if( session.isIdle( IdleStatus.BOTH_IDLE ) )
85                                      session.getManagerFilterChain()
86                                              .sessionIdle( session,
87                                                            IdleStatus.BOTH_IDLE );
88                              }
89  
90                              if( !session.isIdle( IdleStatus.READER_IDLE ) )
91                              {
92                                  idleTime = config
93                                          .getIdleTimeInMillis( IdleStatus.READER_IDLE );
94                                  session.setIdle( IdleStatus.READER_IDLE,
95                                                   idleTime > 0L
96                                                   && ( currentTime - session.getLastReadTime() ) > idleTime );
97                                  if( session.isIdle( IdleStatus.READER_IDLE ) )
98                                      session.getManagerFilterChain()
99                                              .sessionIdle( session,
100                                                           IdleStatus.READER_IDLE );
101                             }
102 
103                             if( !session.isIdle( IdleStatus.WRITER_IDLE ) )
104                             {
105                                 idleTime = config
106                                         .getIdleTimeInMillis( IdleStatus.WRITER_IDLE );
107                                 session.setIdle( IdleStatus.WRITER_IDLE,
108                                                  idleTime > 0L
109                                                  && ( currentTime - session.getLastWriteTime() ) > idleTime );
110                                 if( session.isIdle( IdleStatus.WRITER_IDLE ) )
111                                     session.getManagerFilterChain()
112                                             .sessionIdle( session,
113                                                           IdleStatus.WRITER_IDLE );
114                             }
115                         }
116                     }
117                 }
118             }
119         }
120     }
121 }