Mercurial > hg > digilib-old
comparison common/src/main/java/digilib/util/DigilibJobCenter.java @ 903:7779b37d1d05
refactored into maven modules per servlet type.
can build servlet-api 2.3 and 3.0 via profile now!
| author | robcast |
|---|---|
| date | Tue, 26 Apr 2011 20:24:31 +0200 |
| parents | servlet/src/main/java/digilib/util/DigilibJobCenter.java@ba1eb2d821a2 |
| children |
comparison
equal
deleted
inserted
replaced
| 902:89ba3ffcf552 | 903:7779b37d1d05 |
|---|---|
| 1 /** Wrapper around ExecutionService. | |
| 2 * | |
| 3 */ | |
| 4 package digilib.util; | |
| 5 | |
| 6 import java.util.List; | |
| 7 import java.util.concurrent.BlockingQueue; | |
| 8 import java.util.concurrent.Callable; | |
| 9 import java.util.concurrent.ExecutorService; | |
| 10 import java.util.concurrent.Executors; | |
| 11 import java.util.concurrent.Future; | |
| 12 import java.util.concurrent.ThreadPoolExecutor; | |
| 13 | |
| 14 import org.apache.log4j.Logger; | |
| 15 | |
| 16 /** Wrapper around ExecutionService. | |
| 17 * | |
| 18 * @author casties | |
| 19 * | |
| 20 */ | |
| 21 public class DigilibJobCenter<V> { | |
| 22 /** general logger for this class */ | |
| 23 private static Logger logger = Logger.getLogger("digilib.jobcenter"); | |
| 24 /** ExecutorService */ | |
| 25 private ExecutorService executor; | |
| 26 /** max number of running threads */ | |
| 27 private int maxThreads = 1; | |
| 28 /** max number of waiting threads */ | |
| 29 private int maxQueueLen = 50; | |
| 30 /** label for this job center */ | |
| 31 private String label = ""; | |
| 32 | |
| 33 /** Create a DigilibJobcenter with the given number of threads and queue length. | |
| 34 * If prestart=true it starts the threads in the thread pool. | |
| 35 * | |
| 36 * @param maxThreads | |
| 37 * @param maxQueueLen | |
| 38 * @param prestart | |
| 39 * @param label | |
| 40 */ | |
| 41 public DigilibJobCenter(int maxThreads, int maxQueueLen, boolean prestart, String label) { | |
| 42 super(); | |
| 43 this.label = (label != null) ? label : ""; | |
| 44 this.maxThreads = maxThreads; | |
| 45 this.maxQueueLen = maxQueueLen; | |
| 46 executor = Executors.newFixedThreadPool(maxThreads); | |
| 47 if (prestart) { | |
| 48 // prestart threads so Tomcat's leak protection doesn't complain | |
| 49 int st = ((ThreadPoolExecutor)executor).prestartAllCoreThreads(); | |
| 50 logger.debug(label+" prestarting threads: "+st); | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 /** Submit Callable job that returns a Value to execute. | |
| 55 * | |
| 56 * @param job | |
| 57 * @return Future to control the job | |
| 58 */ | |
| 59 public Future<V> submit(Callable<V> job) { | |
| 60 return executor.submit(job); | |
| 61 } | |
| 62 | |
| 63 /** Submit Runnable job to execute. | |
| 64 * | |
| 65 * @param job | |
| 66 * @return Future to control the job | |
| 67 */ | |
| 68 public Future<?> submit(Runnable job) { | |
| 69 return executor.submit(job); | |
| 70 } | |
| 71 | |
| 72 /** Returns if the service is overloaded. | |
| 73 * | |
| 74 * @return | |
| 75 */ | |
| 76 public boolean isBusy() { | |
| 77 int jql = getWaitingJobs(); | |
| 78 int jrl = getRunningJobs(); | |
| 79 logger.debug(label+" isBusy: waiting jobs="+jql+" running jobs="+jrl); | |
| 80 return (jql > maxQueueLen); | |
| 81 } | |
| 82 | |
| 83 /** Returns the number of currently running jobs. | |
| 84 * @return | |
| 85 */ | |
| 86 public int getRunningJobs() { | |
| 87 return ((ThreadPoolExecutor)executor).getActiveCount(); | |
| 88 } | |
| 89 | |
| 90 /** Returns the number of currently waiting jobs. | |
| 91 * @return | |
| 92 */ | |
| 93 public int getWaitingJobs() { | |
| 94 BlockingQueue<Runnable> jq = ((ThreadPoolExecutor)executor).getQueue(); | |
| 95 int jql = jq.size(); | |
| 96 return jql; | |
| 97 } | |
| 98 | |
| 99 public void setMaxThreads(int maxThreads) { | |
| 100 this.maxThreads = maxThreads; | |
| 101 } | |
| 102 | |
| 103 public int getMaxThreads() { | |
| 104 return maxThreads; | |
| 105 } | |
| 106 | |
| 107 public void setMaxQueueLen(int maxQueueLen) { | |
| 108 this.maxQueueLen = maxQueueLen; | |
| 109 } | |
| 110 | |
| 111 public int getMaxQueueLen() { | |
| 112 return maxQueueLen; | |
| 113 } | |
| 114 | |
| 115 /** Shuts down the Executor. | |
| 116 * Tries to stop running threads and returns a list of waiting threads. | |
| 117 * | |
| 118 * @return | |
| 119 */ | |
| 120 public List<Runnable> shutdownNow() { | |
| 121 return executor.shutdownNow(); | |
| 122 } | |
| 123 | |
| 124 } |
