annotate servlet/src/digilib/util/DigilibJobCenter.java @ 570:fd2ef7e46119

more cleanup, set version to 1.8.2
author robcast
date Tue, 21 Dec 2010 20:24:09 +0100
parents 686086d6e6d6
children 587c90bc5976
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 546
diff changeset
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
e7c29b587829 more work on util.concurrent compliant structure
casties
parents: 544
diff changeset
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
686086d6e6d6 more refactoring and rearranging
robcast
parents: 557
diff changeset
30 /** label for this job center */
686086d6e6d6 more refactoring and rearranging
robcast
parents: 557
diff changeset
31 private String label = "";
544
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
32
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
33 /** Create a DigilibJobcenter with the given number of threads and queue length.
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
34 * If prestart=true it starts the threads in the thread pool.
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
35 *
544
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
36 * @param maxThreads
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
37 * @param maxQueueLen
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
38 * @param prestart
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
39 * @param label
544
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
40 */
563
686086d6e6d6 more refactoring and rearranging
robcast
parents: 557
diff changeset
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
686086d6e6d6 more refactoring and rearranging
robcast
parents: 557
diff changeset
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
686086d6e6d6 more refactoring and rearranging
robcast
parents: 557
diff changeset
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
e7c29b587829 more work on util.concurrent compliant structure
casties
parents: 544
diff changeset
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
686086d6e6d6 more refactoring and rearranging
robcast
parents: 557
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
74 /** Returns the number of currently running jobs.
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
75 * @return
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
81 /** Returns the number of currently waiting jobs.
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
82 * @return
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
106 /** Shuts down the Executor.
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
107 * Tries to stop running threads and returns a list of waiting threads.
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
108 *
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
109 * @return
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 563
diff changeset
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 }