http://www.cnblogs.com/Ivan-j2ee/archive/2012/04/13/2445421.html
OFBiz执行后台任务的类在org.ofbiz.service.job中。
JobPoller和JobInvoker是主要的两个类,一个负责查询可以执行的Job,另一个执行Job任务。Job类图如下所示。
1.Job轮询
创建JobManager时,会创建JobPoller的一个实例。JobPoller实现了Runnable接口,以此创建线程后
通过JobManager一直轮询是否有Job需要执行,如果有奖将其放入队列中。
2 try {
3 // wait 30 seconds before the first poll
4 java.lang.Thread.sleep( 30000 );
5 } catch (InterruptedException e) {
6 }
7 while (isRunning) {
8 try {
9 // grab a list of jobs to run.
10 List < Job > pollList = jm.poll();
11 // Debug.logInfo("Received poll list from JobManager [" + pollList.size() + "]",module);
12
13 for (Job job : pollList) {
14 if (job.isValid()) {
15 queueNow(job);
16 // Debug.logInfo("Job [" + job.getJobId() + "] is queued",module);
17 }
18 }
19 // NOTE: using sleep instead of wait for stricter locking
20 java.lang.Thread.sleep(pollWaitTime());
21 } catch (InterruptedException e) {
22 Debug.logError(e,module);
23 stop();
24 }
25 }
26 }
27
queueNow方法将要执行job放入到队列中,如果队列中的等待执行的job数量很多,那么就创建一定数量的线程执行这些job。
2 synchronized (run) {
6 run.add(job);
7 }
8 if (Debug.verboSEOn()) Debug.logVerbose( " New run queue size: " + run.size(),module);
9 if (run.size() > pool.size() && pool.size() < maxThreads()) {
10 synchronized (pool) {
11 if (run.size() > pool.size() && pool.size() < maxThreads()) {
12 int calcSize = (run.size() / jobsPerThread()) - (pool.size());
13 int addSize = calcSize > maxThreads() ? maxThreads() : calcSize;
14
15 for ( int i = 0 ; i < addSize; i ++ ) {
16 JobInvoker iv = new JobInvoker( this ,invokerWaitTime());
17 pool.add(iv);
18 }
19 }
20 }
21 }
22 }