Spring Quartz動態管理定時任務及相關問題總結
1.application-context.xml配置
<bean id="jobFactory" class="com.kilomob.powernetwork.chinaunicom.quartz.MyJobFactory"></bean>
<bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"> </property>
</bean> <!--這是核心的,其他兩個是為了解決bean是為了解決在任務類中獲取不到註解類的問題新增的-->
<bean id="quartzManager" class="com.kilomob.powernetwork.chinaunicom.quartz.QuartzManager"></bean>
2.任務類QuartzJobFactory類編寫
@PersistJobDataAfterExecution
public class QuartzJobFactory implements Job {
private static final Logger LOGGER = LoggerFactory
.getLogger(QuartzJobFactory.class);
@Autowired
RedisService redisService;//註解得到快取service
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("任務成功執行" );
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
String[] strings = jobDataMap.getKeys();
for (int i = 0; i < strings.length; i++) {
CardRetireSet sCardRetireSet = (CardRetireSet) jobDataMap
.get(strings[i]);
LOGGER.info("定時器測試++++++++++++++++++" + strings[i]
+ "+++++++++++++++++++++" + sCardRetireSet.getId());
}
}
}
3.定時任務管理類
public class QuartzManager {
private static final Logger LOGGER = LoggerFactory
.getLogger(QuartzManager.class);
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
@Autowired
RedisService redisService;
//新增一個定時任務
public void add(CardRetireSet job) throws IOException, SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(job.getId() + "",
job.getId() + "");
// 獲取trigger,即在spring配置檔案中定義的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 不存在,建立一個
if (null == trigger) {
JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class)
.withIdentity(job.getId() + "", job.getId() + "").build();
jobDetail.getJobDataMap().put(triggerKey.toString(), job);
LOGGER.info(jobDetail.getJobDataMap().getKeys()[0] + " "
+ job.getId());
/*
* redisService.lpush(triggerKey.toString(), JSONObject.toJSON(job)
* .toString());
*/
// 表示式排程構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(dateConvertToCron(job.getTriggerDate()));
// 按新的cronExpression表示式構建一個新的trigger
trigger = TriggerBuilder.newTrigger()
.withIdentity(job.getId() + "", job.getId() + "")
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
} else {
// Trigger已存在,那麼更新相應的定時設定
// 表示式排程構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(dateConvertToCron(job.getTriggerDate()));
// 按新的cronExpression表示式重新構建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();
// 按新的trigger重新設定job執行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
//列表
public void list throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
for (JobKey jobKey : jobKeys) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
ScheduleJob job = new ScheduleJob();
job.setJobName(jobKey.getName());
job.setJobGroup(jobKey.getGroup());
job.setDesc("觸發器:" + trigger.getKey());
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
job.setJobStatus(triggerState.name());
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
job.setCronExpression(cronExpression);
}
jobList.add(job);
}
}
}
//停止
public String stop() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.pauseJob(jobKey);
}
//重啟
public String reStart() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.resumeJob(jobKey);
}
//
public String startNow(@PathVariable String jobGroup, @PathVariable String jobName) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.triggerJob(jobKey);
}
//刪除
public String del(@PathVariable String jobGroup, @PathVariable String jobName) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.deleteJob(jobKey);
}
}
問題:
1,在任務類中無法使用註解得到其他service
解決方法:
新建MyJobFactory類,在application-context.xml中注入(見上面配置檔案)
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
protected Object createJobInstance(TriggerFiredBundle bundle)
throws Exception {
// 呼叫父類的方法
Object jobInstance = super.createJobInstance(bundle);
// 進行注入,這屬於Spring的技術,不清楚的可以檢視Spring的API.
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
2.利用JobDataMap傳參給任務類的時候,如果是同一個請求迴圈建立了多個task,則儲存的是最後map集合,後面通過快取處理。
相關推薦
Spring Quartz動態管理定時任務及相關問題總結
1.application-context.xml配置 <bean id="jobFactory" class="com.kilomob.powernetwork.chinaunicom.quartz.MyJobFactory"></bean
Spring Quartz 動態配置定時任務
1、Quartz在Spring中的簡單配置 Spring配置檔案quartz.xml: Java程式碼 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "
Quartz+Spring Boot實現動態管理定時任務
varchar 設置 ica key equals 修改 lean queryall 觸發器 項目實踐過程中碰到一個動態管理定時任務的需求:針對每個人員進行信息的定時更新,具體更新時間可隨時調整、啟動、暫定等。 思路 將每個人員信息的定時配置保存到數據庫中,這樣實現了任
Spring 動態管理定時任務(使用quartz) 只是管理啟動時間 不能做啟動和暫停
前言:以前都沒有做記錄的習慣,發現做過的專案中用過的技術都很容易給忘了,然後要一次次的翻API一次次的查百度,浪費了大量的時間, 看到了同事和朋友用部落格的方式記錄著自己的收穫,想到自己也應該這樣做,以後就不會浪費時間做自己做過的事了。 框架:Spring4 MVC 利用的
Spring+Quartz框架實現定時任務(集群,分布式)
log cor alt 放置 這一 表達 mod 建數據庫 strac 1、定時任務的必要性:定時任務在應用中的重要性不言而喻,大多是應用,特別是金融應用更是離不開定時任務,能用定時任務來處理異常訂單,完成跑批,定時活動(雙11)等。在初期應用的訪問量並不是那麽大,
Spring+Quartz+Hibernate做定時任務時不能獲得Session的解決方法
今天在做專案是遇到,Spring+Quartz+Hibernate做定時任務時不能獲得Session;記錄下來方便以後檢視 方案如下: http://forum.spring.io/forum/spring-projects/container/102822-how-to-get-a
SpringBoot整合quartz動態建立定時任務實現以及踩過的坑
需要了解一下quartz有Job,Scheduler,Trigger等概念,在此就不詳細說明 首先說一下功能需求場景 該提醒可以在頁面上進行配置多個,比如可以配置一個提醒:在每天的12點,傳送郵件給某個人,可以繼續配置另外一個提醒:在每個月的10號,給某個人
spring quartz動態實現對任務的增刪改查(可傳引數)
上一篇文章寫到了關於定時任務的動態實現,在一些情況下,我們可能需要傳引數來實現定時任務,直接貼程式碼了QuartzParamUtils,核心類package com.thinkgem.jeesite.modules.task.quartz.param; im
基於spring+quartz的分散式定時任務框架
問題背景 我公司是一個快速發展的創業公司,目前有200人,主要業務是旅遊和酒店相關的,應用迭代更新週期比較快,因此,開發人員花費了更多的時間去更=跟上迭代的步伐,而缺乏了對整個系統的把控 沒有叢集之前,公司定時任務的實現方式 在初期應用的訪問量並
Spring Boot介面畫管理Quartz定時任務及多執行緒併發執行定時任務
工程程式碼示例 : Spring Boot整合持久化Quartz定時任務管理和介面展示 工程地址 : https://github.com/tjfy1992/SpringBootQuartz 執行方法 Spring Boot工程已經集成了伺
Quartz動態管理一次性定時任務(Spring)
本次實現採用的是簡陋的Quartz實現。在Spring容器中配好相應的元件包。不採用配置檔案實現每天定時迴圈任務,本次實現的是一次性定時。(幾天後執行一個操作,操作完成後刪除該定時,每次操作的內容不相同)。在執行任務的時候注入Spring管理的物件。 1、動態
Spring+Quartz實現動態新增定時任務(一)
在最近工作中,由於涉及到定時任務特別多,而這些工作又是由下屬去完成的,在生成環境中經常會出現業務邏輯錯誤,分析下來多數是定時任務執行問題,所以就希望把定時任務優化一下,主要實現2個方面1.定時任務動態配置及持久化2.視覺化的管理介面,可以非常清晰的管理自己的所有定時任務首先,
Spring-boot整合Quartz,3、動態配置定時任務
通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業 首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。 設定JobDetail的名字和組
Spring與Quartz實現動態更新定時任務
applicationContext-quartz.xml配置: <!-- 任務排程測試實現一 : 自定義的任務物件com.bocloud.equipment.test.ExampleJob 必須繼承QuartzJobBean類,實現抽象方法executeInter
Spring 3整合Quartz 2實現定時任務三:動態暫停 恢復 修改和刪除任務
前面我們已經完成了spring 3和quartz 2的整合以及動態新增定時任務,我們接著來完善它,使之能支援更多的操作,例如暫停、恢復、修改等。 在動態新增定時任務中其實已經涉及到了其中的一些程式碼,這裡我們再來細化的理一理。先來看一下我們初步要實現的目標效果圖,這裡
Spring 配置quartz定時任務及時間設定
(1)在applicationContext-quartz.xml配置檔案裡面配置好 <!-- 定時任務啟動 定時30推送一次 reportTemporaryService為servi
springboot整合Quartz實現動態配置定時任務
打印 uil xtra serve mail evel .com 指定 obs 前言 在我們日常的開發中,很多時候,定時任務都不是寫死的,而是寫到數據庫中,從而實現定時任務的動態配置,下面就通過一個簡單的示例,來實現這個功能。 一、新建一個springboot工程,並添加依
Spring整合Quartz框架實現定時任務跑批(Maven完整版)
觸發器 delay cut www 方法 lin job 定時任務 任務調度 Quartz 介紹Quartz is a full-featured, open source job scheduling service that can be integrated with
Spring Boot筆記之定時任務(Quartz)
摘要 Spring Boot2.x支援spring-boot-starter-quartz,本文介紹spring-boot-starter-quartz配置及使用。 pom引入 <dependency> <groupId>org.springframew
spring中輕鬆實現定時任務,quartz表示式的線上Cron表示式生成器推薦
東西雖簡單,保留下來,開箱即用,省時省力!!!!! 1.首先在pom.xml中引入quartz相關包 <dependency> <groupId>org.quartz-scheduler</groupId>