annotate servlet/src/digilib/util/DigilibJobCenter.java @ 557:0885f5ca5b24 digilibPDF

more refactoring and rearranging pdf and image generation works now
author robcast
date Thu, 16 Dec 2010 21:19:11 +0100
parents servlet/src/digilib/servlet/DigilibJobCenter.java@e7c29b587829
children 686086d6e6d6
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 import digilib.image.DocuImage;
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 /** Wrapper around ExecutionService.
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 * @author casties
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
21 *
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
22 */
546
e7c29b587829 more work on util.concurrent compliant structure
casties
parents: 544
diff changeset
23 public class DigilibJobCenter<V> {
544
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
24 /** general logger for this class */
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
25 private static Logger logger = Logger.getLogger("digilib.jobcenter");
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
26 /** ExecutorService */
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
27 private ExecutorService executor;
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
28 /** max number of running threads */
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
29 private int maxThreads = 1;
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
30 /** max number of waiting threads */
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
31 private int maxQueueLen = 50;
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
32
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
33 /**
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
34 * @param maxThreads
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
35 * @param maxQueueLength
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
36 */
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
37 public DigilibJobCenter(int maxThreads, int maxQueueLen, boolean prestart) {
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
38 super();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
39 this.maxThreads = maxThreads;
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
40 this.maxQueueLen = maxQueueLen;
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
41 executor = Executors.newFixedThreadPool(maxThreads);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
42 if (prestart) {
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
43 // prestart threads so Tomcat's leak protection doesn't complain
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
44 int st = ((ThreadPoolExecutor)executor).prestartAllCoreThreads();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
45 logger.debug("prestarting threads: "+st);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
46 }
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
47 }
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
48
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
49 /** Submit job to execute
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
50 *
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
51 * @param job
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
52 * @return Future to control the job
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
53 */
546
e7c29b587829 more work on util.concurrent compliant structure
casties
parents: 544
diff changeset
54 public Future<V> submit(Callable<V> job) {
544
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
55 return executor.submit(job);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
56 }
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
57
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
58 /** Returns if the service is not overloaded.
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
59 *
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
60 * @return
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 public boolean canRun() {
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
63 int jql = getWaitingJobs();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
64 int jrl = getRunningJobs();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
65 logger.debug("canRun: waiting jobs="+jql+" running jobs="+jrl);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
66 return (jql <= maxQueueLen);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
67 }
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
68
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
69 /** Returns if the service is overloaded.
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
70 *
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
71 * @return
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 public boolean isBusy() {
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
74 int jql = getWaitingJobs();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
75 int jrl = getRunningJobs();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
76 logger.debug("isBusy: waiting jobs="+jql+" running jobs="+jrl);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
77 return (jql > maxQueueLen);
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
78 }
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 public int getRunningJobs() {
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
81 return ((ThreadPoolExecutor)executor).getActiveCount();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
82 }
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
83
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
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
106 public List<Runnable> shutdownNow() {
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
107 return executor.shutdownNow();
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
108 }
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
109
5ff500d6812a more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
110 }