1
19
20 package com.liferay.portal.job;
21
22 import com.liferay.portal.dao.shard.ShardUtil;
23 import com.liferay.portal.kernel.job.IntervalJob;
24 import com.liferay.portal.kernel.log.Log;
25 import com.liferay.portal.kernel.log.LogFactoryUtil;
26 import com.liferay.portal.util.PropsValues;
27
28 import org.quartz.JobDetail;
29 import org.quartz.JobExecutionContext;
30 import org.quartz.StatefulJob;
31
32
38 public class JobWrapper implements StatefulJob {
39
40 public void execute(JobExecutionContext context) {
41 try {
42 if (_job == null) {
43 JobDetail jobDetail = context.getJobDetail();
44
45 Class<IntervalJob> intervalJobClass = JobClassUtil.get(
46 jobDetail.getName());
47
48 _classLoader = intervalJobClass.getClassLoader();
49
50 _job = (IntervalJob)_classLoader.loadClass(
51 intervalJobClass.getName()).newInstance();
52 }
53
54 Thread currentThread = Thread.currentThread();
55
56 ClassLoader contextClassLoader =
57 currentThread.getContextClassLoader();
58
59 try {
60 currentThread.setContextClassLoader(_classLoader);
61
62 for (String shardName : PropsValues.SHARD_AVAILABLE_NAMES) {
63 ShardUtil.pushCompanyService(shardName);
64
65 try {
66 _job.execute(new JobExecutionContextImpl(context));
67 }
68 finally {
69 ShardUtil.popCompanyService();
70 }
71 }
72 }
73 finally {
74 currentThread.setContextClassLoader(contextClassLoader);
75 }
76 }
77 catch (Exception e) {
78 _log.error(e, e);
79 }
80 }
81
82 private static Log _log = LogFactoryUtil.getLog(JobWrapper.class);
83
84 private ClassLoader _classLoader;
85 private IntervalJob _job;
86
87 }