1. 程式人生 > >Spring Quartz動態管理定時任務及相關問題總結

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的名字和組

SpringQuartz實現動態更新定時任務

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>