src/java/isac/bridge/TimeCheckerThread.java
author mlang
Tue, 28 Jun 2005 13:14:03 +0200
changeset 2544 631fe7f467b7
parent 2452 6d3ab94e30fc
child 2702 9bf878f8e856
permissions -rw-r--r--
cosmetics part2
     1 /*
     2  * Created on Aug 21, 2003
     3  */
     4 package isac.bridge;
     5 
     6 /**
     7  * @author rgradisc
     8  * 
     9  * Stores times of requests to sml-kernel. This is used for informing
    10  * Clients2KernelServer to kill sml-kernel if no response is coming back for a
    11  * certain amount of time, which means that the bridge_ has probably crashed or
    12  * is caught in an endless loop, and neeeds to be restarted.
    13  */
    14 
    15 import java.util.Vector;
    16 
    17 import org.apache.log4j.Logger;
    18 
    19 public class TimeCheckerThread extends Thread {
    20 
    21     //Time to wait for response from the kernel to a request
    22     private long wait_millis_;
    23 
    24     //Stores the times when the waitTime for current request will run out
    25     private Vector time_out_times_;
    26 
    27     //Reference to the bridgeMain object
    28     private BridgeMain bridge_;
    29 
    30     static Logger logger_ = Logger.getLogger(TimeCheckerThread.class.getName());
    31 
    32     /**
    33      * Constructor: instantiate a new TimeCheckerThread
    34      * 
    35      * @param bridge_
    36      *            BridgeMain object that belongs to this TimeCheckerThread
    37      * @param wait_millis_
    38      *            Time to wait for response from kernel before restarting
    39      */
    40     public TimeCheckerThread(BridgeMain bridge, long waitMillis) {
    41         logger_.warn("TimeCheckerThread: bridge_=" + bridge + ", wait_millis_"
    42                 + waitMillis);
    43         this.bridge_ = bridge;
    44         this.time_out_times_ = bridge.getTimeOutTimes();
    45         this.wait_millis_ = waitMillis;
    46     }
    47 
    48     /**
    49      * Start this Thread
    50      */
    51     public void run() {
    52         try {
    53             while (true) {
    54                 if (!time_out_times_.isEmpty()) {
    55                     long first = ((Long) time_out_times_.firstElement())
    56                             .longValue();
    57                     long timeOut = first + wait_millis_;
    58                     long now = System.currentTimeMillis();
    59                     if (now > timeOut) {
    60                         // timeOut: no response from sml-kernel within TIME_OUT:
    61                         // restart sml-kernel
    62                         bridge_.restartSML();
    63                     } else {
    64                         // sleep until first time in vector would run out (plus
    65                         // a little buffer)
    66                         long sleepTime = timeOut - now + 20;
    67                         bridge_
    68                                 .log(
    69                                         1,
    70                                         "TimeCheckerThread: "
    71                                                 + time_out_times_.size()
    72                                                 + " request(s) waiting for response, sleeping for "
    73                                                 + sleepTime + " millis");
    74                         sleep(sleepTime);
    75                     }
    76                 } else {
    77                     // TimesVector is empty: No pending requests
    78                     bridge_.log(1,
    79                             "TimeCheckerThread: no requests, sleeping for "
    80                                     + wait_millis_ + " millis");
    81                     sleep(wait_millis_);
    82                 }
    83             }
    84         } catch (InterruptedException e) {
    85             bridge_.log(1, "TimeCheckerThread interrupted");
    86         }
    87     }
    88 
    89 }