Mercurial > hg > digilib-old
annotate servlet/src/digilib/util/DigilibJobCenter.java @ 611:1b6202aba26e jquery
work on button creation
(reinstated jquery-test)
author | robcast |
---|---|
date | Fri, 14 Jan 2011 15:21:15 +0100 |
parents | fd2ef7e46119 |
children | 587c90bc5976 |
rev | line source |
---|---|
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
1 /** Wrapper around ExecutionService. |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
2 * |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
3 */ |
557 | 4 package digilib.util; |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
5 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
6 import java.util.List; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
7 import java.util.concurrent.BlockingQueue; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
8 import java.util.concurrent.Callable; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
9 import java.util.concurrent.ExecutorService; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
10 import java.util.concurrent.Executors; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
11 import java.util.concurrent.Future; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
12 import java.util.concurrent.ThreadPoolExecutor; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
13 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
14 import org.apache.log4j.Logger; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
15 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
16 /** Wrapper around ExecutionService. |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
17 * |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
18 * @author casties |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
19 * |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
20 */ |
546 | 21 public class DigilibJobCenter<V> { |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
22 /** general logger for this class */ |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
23 private static Logger logger = Logger.getLogger("digilib.jobcenter"); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
24 /** ExecutorService */ |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
25 private ExecutorService executor; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
26 /** max number of running threads */ |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
27 private int maxThreads = 1; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
28 /** max number of waiting threads */ |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
29 private int maxQueueLen = 50; |
563 | 30 /** label for this job center */ |
31 private String label = ""; | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
32 |
570 | 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 * | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
36 * @param maxThreads |
570 | 37 * @param maxQueueLen |
38 * @param prestart | |
39 * @param label | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
40 */ |
563 | 41 public DigilibJobCenter(int maxThreads, int maxQueueLen, boolean prestart, String label) { |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
42 super(); |
563 | 43 this.label = (label != null) ? label : ""; |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
44 this.maxThreads = maxThreads; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
45 this.maxQueueLen = maxQueueLen; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
46 executor = Executors.newFixedThreadPool(maxThreads); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
47 if (prestart) { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
48 // prestart threads so Tomcat's leak protection doesn't complain |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
49 int st = ((ThreadPoolExecutor)executor).prestartAllCoreThreads(); |
563 | 50 logger.debug(label+" prestarting threads: "+st); |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
51 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
52 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
53 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
54 /** Submit job to execute |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
55 * |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
56 * @param job |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
57 * @return Future to control the job |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
58 */ |
546 | 59 public Future<V> submit(Callable<V> job) { |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
60 return executor.submit(job); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
61 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
62 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
63 /** Returns if the service is overloaded. |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
64 * |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
65 * @return |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
66 */ |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
67 public boolean isBusy() { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
68 int jql = getWaitingJobs(); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
69 int jrl = getRunningJobs(); |
563 | 70 logger.debug(label+" isBusy: waiting jobs="+jql+" running jobs="+jrl); |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
71 return (jql > maxQueueLen); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
72 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
73 |
570 | 74 /** Returns the number of currently running jobs. |
75 * @return | |
76 */ | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
77 public int getRunningJobs() { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
78 return ((ThreadPoolExecutor)executor).getActiveCount(); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
79 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
80 |
570 | 81 /** Returns the number of currently waiting jobs. |
82 * @return | |
83 */ | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
84 public int getWaitingJobs() { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
85 BlockingQueue<Runnable> jq = ((ThreadPoolExecutor)executor).getQueue(); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
86 int jql = jq.size(); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
87 return jql; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
88 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
89 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
90 public void setMaxThreads(int maxThreads) { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
91 this.maxThreads = maxThreads; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
92 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
93 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
94 public int getMaxThreads() { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
95 return maxThreads; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
96 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
97 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
98 public void setMaxQueueLen(int maxQueueLen) { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
99 this.maxQueueLen = maxQueueLen; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
100 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
101 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
102 public int getMaxQueueLen() { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
103 return maxQueueLen; |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
104 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
105 |
570 | 106 /** Shuts down the Executor. |
107 * Tries to stop running threads and returns a list of waiting threads. | |
108 * | |
109 * @return | |
110 */ | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
111 public List<Runnable> shutdownNow() { |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
112 return executor.shutdownNow(); |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
113 } |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
114 |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
115 } |