View Javadoc

1   /*
2    * @(#) $Id: VmPipeIdleStatusChecker.java 327113 2005-10-21 06:59:15Z 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: 327113 $, $Date: 2005-10-21 15:59:15 +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 }