1.定義job導出類
1 public class MyQuartzJob implements Job {
2 private static Logger logger = LoggerFactory.getLogger(MyQuartzJob.class);
3
4 @Override
5 public void execute(JobExecutionContext context) throws JobExecutionException {
6 // TODO Auto-generated method stub
7 System.out.println("任務成功運作,時間為:===" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
8 // JobDataMap jdm = context.getMergedJobDataMap();
9
10 JobDetailImpl jdi = (JobDetailImpl) context.getJobDetail();
11
12 JobKey jk = jdi.getKey();
13
14 String jobName = jk.getName();
15 String jobGroup = jk.getGroup();
16
17 Trigger trigger = context.getTrigger();
18 TriggerKey triggerKey = trigger.getKey();
19
20 String triggerName = triggerKey.getName();
21 String triggerGroup = triggerKey.getGroup();
22
23 if (jobName.equals("我的cron任務1")) {
24 try {
25 QuartzManager.modifyJobTime(triggerKey, "0 0/3 * * * ?");
26 } catch (SchedulerException e) {
27 // TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 }
31 System.out.println("目前執行的job是:" + jobName + ";job的組名是:" + jobGroup + ";trigger名稱是:" + triggerName
32 + ";trigger的組名是:" + triggerGroup + ";下次執行時間為:"
33 + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(context.getNextFireTime()));
34 System.out.println();
35 // JobDetailImpl scheduleJob = (JobDetailImpl)
36 // context.getMergedJobDataMap().get("scheduleJob");
37 // System.out.println("任務名稱 = [" + scheduleJob.getName() + "]");
38
39 /*
40 *從jobDataMap中取得推送相關的額外資訊;
41 * */
42 JobDataMap dataMap = context.getMergedJobDataMap();
43 // userId
44 String userId = (String) dataMap.get("userId");
45 //
46 String messageTypes = (String) dataMap.get("messageTypes");
47
48 //下邊的這裡是項目的業務 就不貼出來了
49 // 根據使用者id查詢該使用者定義的
50 // PushAlarmService alarmService = SpringUtils.getBean(PushAlarmService.class);
51 // alarmService.selByUserId(Integer.valueOf(userId));
52
53 }
54 }
2.定義一個定時器的管理類:專門負責定時器的新增、修改、删除、啟動、結束等。
1 import org.quartz.CronScheduleBuilder;
2 import org.quartz.CronTrigger;
3 import org.quartz.JobBuilder;
4 import org.quartz.JobDataMap;
5 import org.quartz.JobDetail;
6 import org.quartz.JobKey;
7 import org.quartz.Scheduler;
8 import org.quartz.SchedulerException;
9 import org.quartz.SimpleScheduleBuilder;
10 import org.quartz.SimpleTrigger;
11 import org.quartz.Trigger;
12 import org.quartz.TriggerBuilder;
13 import org.quartz.TriggerKey;
14 import org.quartz.impl.StdSchedulerFactory;
15
16 public class QuartzManager {
17 // private static final String JOB_GROUP_NAME = "SDJK_APP_JOBGROUP_NAME";
18 /// private static String TRIGGER_GROUP_NAME = "SDJK_APP_TRIGGERGROUP_NAME";
19 public static StdSchedulerFactory sf = new StdSchedulerFactory();
20 // public static StdScheduler ss = (StdScheduler) SpringUtils.getBean("schedulerFactoryBean");
21
22 /**
23 *
24 * @Title:
25 * @Description: 建立SimpleTrigger定時器,startnow,run forever
26 *
27 * @param jobKey
28 * @param triggerKey
29 * @param cls
30 * @param repeatIntevalTime
31 * @throws SchedulerException
32 */
33 public static void addJob(JobKey jobKey, TriggerKey triggerKey, Class<? extends Job> cls, int repeatIntevalTime,
34 JobDataMap jobDataMap) throws SchedulerException {
35
36 Scheduler sched = sf.getScheduler();
37
38 JobDetail jd = JobBuilder.newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();// jobDetail
39
40 SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
41 .withSchedule(
42 SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(repeatIntevalTime).repeatForever())
43 .startNow().build();// triggerkey用來辨別trigger身份
44
45 sched.scheduleJob(jd, trigger);// 設定排程器
46
47 try {
48
49 if (!sched.isShutdown()) {
50 sched.start();
51 }
52
53 } catch (SchedulerException e) {
54 // TODO Auto-generated catch block
55 e.printStackTrace();
56 }
57 }
58
59 /**
60 *
61 * @Title:
62 * @Description: 添加cronTrigger的定時器
63 *
64 * @param jobKey
65 * @param triggerKey
66 * @param jobClass
67 * @param cron
68 * @param JobDataMap
69 * jobDataMap
70 */
71 @SuppressWarnings({ "unchecked", "rawtypes" })
72 public static void addJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron,
73 JobDataMap jobDataMap) {
74 try {
75 // 任務名,任務組,任務執行類;可以将自己需要的額外資訊添加到jobdatamap中。
76 JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build();
77
78 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 觸發器
79
80 triggerBuilder.withIdentity(triggerKey);// 觸發器名,觸發器組
81
82 triggerBuilder.startNow();// 現在執行
83
84 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 觸發器執行規則
85
86 CronTrigger trigger = (CronTrigger) triggerBuilder.build();// 建立CronTrigger對象
87
88 Scheduler sched = sf.getScheduler();// 建立排程器
89
90 sched.scheduleJob(jobDetail, trigger);// 排程容器設定JobDetail和Trigger
91
92 if (!sched.isShutdown()) {// 啟動
93 sched.start();
94 }
95 } catch (Exception e) {
96 throw new RuntimeException(e);
97 }
98 }
99
100 /**
101 *
102 * @Title:
103 * @Description: 修改cronTrigger定時器
104 *
105 * @param triggerKey
106 * trigger辨別
107 * @param cron
108 * @throws SchedulerException
109 */
110 public static void modifyJobTime(TriggerKey triggerKey, String cron) throws SchedulerException {
111
112 Scheduler sched = sf.getScheduler();
113
114 try {
115 // TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
116
117 CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
118
119 if (trigger == null) {
120 return;
121 }
122
123 String oldTime = trigger.getCronExpression();
124
125 if (!oldTime.equalsIgnoreCase(cron)) {
126
127 /** 方式一 :調用 rescheduleJob 開始 */
128 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 觸發器
129
130 triggerBuilder.withIdentity(triggerKey);// 觸發器名,觸發器組
131
132 triggerBuilder.startNow();// 立即執行
133
134 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 觸發器時間設定
135
136 trigger = (CronTrigger) triggerBuilder.build();// 建立Trigger對象
137
138 sched.rescheduleJob(triggerKey, trigger);// 修改一個任務的觸發時間
139
140 /** 方式一 :調用 rescheduleJob 結束 */
141
142 /** 方式二:先删除,然後在建立一個新的Job */
143 // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
144 // Class<? extends Job> jobClass = jobDetail.getJobClass();
145 // removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
146 // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
147 /** 方式二 :先删除,然後在建立一個新的Job */
148 }
149 } catch (Exception e) {
150 throw new RuntimeException(e);
151 }
152 }
153
154 /**
155 *
156 * @Title:
157 * @Description: 隻修改simpleTrigger觸發器的觸發時間,不更改trigger的triggerKey
158 *
159 * @param triggerKey
160 * trigger辨別
161 * @param repeatIntervalTime
162 * 重複間隔時長
163 * @throws SchedulerException
164 */
165 public static void modifyJobTime(TriggerKey triggerKey, int repeatIntervalTime) throws SchedulerException {
166
167 Scheduler sched = sf.getScheduler();
168
169 try {
170
171 SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(triggerKey);
172
173 if (trigger == null) {
174 return;
175 }
176
177 long oldTime = trigger.getRepeatInterval();
178
179 if (oldTime != repeatIntervalTime) {
180
181 /** 方式一 :調用 rescheduleJob 開始 */
182 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 觸發器builder
183
184 triggerBuilder.withIdentity(triggerKey);// 觸發器名,觸發器組
185
186 triggerBuilder.withSchedule(SimpleScheduleBuilder.repeatHourlyForever(repeatIntervalTime));// 更新觸發器的重複間隔時間
187
188 triggerBuilder.startNow();// 立即執行
189
190 trigger = (SimpleTrigger) triggerBuilder.build();// 建立Trigger對象
191
192 sched.rescheduleJob(triggerKey, trigger);// 修改一個任務的觸發時間
193
194 /** 方式一 :調用 rescheduleJob 結束 */
195
196 /** 方式二:先删除,然後在建立一個新的Job */
197 // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
198 // Class<? extends Job> jobClass = jobDetail.getJobClass();
199 // removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
200 // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
201 /** 方式二 :先删除,然後在建立一個新的Job */
202 }
203
204 } catch (Exception e) {
205 throw new RuntimeException(e);
206 }
207 }
208
209 /**
210 *
211 * @Title:
212 * @Description: 根據job和trigger删除任務
213 *
214 * @param jobKey
215 * @param triggerKey
216 */
217 public static void removeJob(JobKey jobKey, TriggerKey triggerKey) {
218
219 try {
220
221 Scheduler sched = sf.getScheduler();
222
223 sched.pauseTrigger(triggerKey);// 停止觸發器
224
225 sched.unscheduleJob(triggerKey);// 移除觸發器
226
227 sched.deleteJob(jobKey);// 删除任務
228
229 } catch (Exception e) {
230
231 throw new RuntimeException(e);
232
233 }
234 }
235
236 /**
237 * @Description:啟動所有定時任務
238 */
239 public static void startJobs(Scheduler sched) {
240 try {
241 sched.start();
242 } catch (Exception e) {
243 throw new RuntimeException(e);
244 }
245 }
246
247 /**
248 * @Description:關閉所有定時任務
249 */
250 public static void shutdownJobs(Scheduler sched) {
251 try {
252 if (!sched.isShutdown()) {
253 sched.shutdown();
254 }
255 } catch (Exception e) {
256 throw new RuntimeException(e);
257 }
258 }
259
260 /**
261 *
262 * @Title:
263 * @Description: 新增或者修改
264 *
265 * @param jobKey
266 * @param triggerKey
267 * @param clz
268 * @param intervalTime
269 * @param jobDataMap
270 * @throws SchedulerException
271 */
272 public static void addOrModify(JobKey jobKey, TriggerKey triggerKey, @SuppressWarnings("rawtypes") Class clz,
273 int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
274
275 Scheduler sched = sf.getScheduler();
276
277 if (sched.checkExists(jobKey)) {// 如果存在,則modify一下job和trigger
278
279 }
280
281 if (sched.checkExists(triggerKey)) {// modify修改trigger
282
283 modifyJobTime(triggerKey, intervalTime);
284
285 } else {// add新增
286
287 addJob(jobKey, triggerKey, clz, intervalTime, jobDataMap);
288
289 }
290
291 }
292 }
可以看到,每次建立job是都要使用一個實作了job接口的類,這個類就是我們自己實作的job導出類。
3.初始定時任務的初始化類。作用:項目啟動時,初始化自己定義的定時器。既然需要項目啟動時就加載所有的定時器,那麼需要在spring容器加載時一起加載。
1 public class InitQuartzJob {
2
3 /**
4 * @throws SchedulerException
5 * @Description:服務啟動時,根據使用者定義的推送規則,初始化所有的推送任務。每個使用者選擇自己的隧道,為每條隧道指定推送的間隔時間。 是以同一個使用者可能有多個定時任務。
6 */
7 public static void init() throws SchedulerException {
8 System.out.println("定時器初始化開始==============================");
9
10 JobDataMap dataMap1 = new JobDataMap();
11 dataMap1.put("subCode", "sdnanhuan");
12 dataMap1.put("messageType", "all");
13 JobKey jobKey1 = new JobKey("我的cron任務1", "我的cron任務組名1");
14 TriggerKey triggerKey1 = new TriggerKey("我的cron觸發器名1", "我的cron觸發器組名1");
15
16 JobKey jobKey2 = new JobKey("我的cron任務2", "我的cron任務組名1");// job的名字不能重複
17 TriggerKey triggerKey2 = new TriggerKey("我的cron觸發器名2", "我的cron觸發器組名2");
18
19 QuartzManager.addJob(jobKey1, triggerKey1, MyQuartzJob.class, "0 0/2 * * * ?", null);
20 QuartzManager.addJob(jobKey2, triggerKey2, MyQuartzJob.class, "0 0/2 * * * ?", null);
21
22
23 }
24 }
4.最後就是在自己的業務系統裡面,調用定時器工具類了。當業務送出後,如果需要建立或者修改定時器,直接在業務層調用工具類就可以了。
轉載https://blog.csdn.net/Jatham/article/details/81384454