spring整合Quartz2持久化任務調度


轉摘 https://blog.csdn.net/qwe6112071/article/details/50999386

 

因為通過Bean配置生成的JobDetail和CronTrigger或SimpleTrigger不能被序列化,因而不能持久化到數據庫中,如果需要用

持久化任務調度,需要編程式創建Quartz的Job等相關實現類

1、spring容器配置參數

<bean id="quartzDataSource" class="org.springframework.jdbc.datasource.DriverManagerDatasource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/quartz" />
    <property name="username" value="xxx" />
    <property name="password" value="xxx" />
</bean>

<!--quartz持久化存儲-->
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
    <property name="dataSource">
        <ref bean="quartzDataSource" />
    </property>
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    <property name="quartzProperties" >
        <props>
            <!--JobStore配置-->
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <!--數據表設置-->
            <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
            <prop key="org.quartz.jobStore.dataSource">myDatasource</prop>            
        </props>
    </property>
</bean>

 

測試類

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.ObjectAlreadyExistsException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class pickNewsJob implements Job {

    @Override
    public void execute(JobExecutionContext jec) throws JobExecutionException {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        System.out.println("在" + sdf.format(new Date()) + "更新日志");
    }

    public static void main(String args[]) throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(pickNewsJob.class)
                .withIdentity("job1", "jgroup1").build();
        SimpleTrigger simpleTrigger = TriggerBuilder
                .newTrigger()
                .withIdentity("trigger1")
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 2)).startNow()
                .build();
        try{
            ApplicationContext ac = new ClassPathXmlApplicationContext("spring/spring-task.xml");
            Scheduler scheduler = (Scheduler) ac.getBean("quartzScheduler");
            scheduler.scheduleJob(jobDetail, simpleTrigger);
            scheduler.start();  
        }catch ( ObjectAlreadyExistsException e) {
            resumeJob();
        }
    }
    /**
     *根據數據庫中的記錄 恢復異常中斷的任務
     */
    public static void resumeJob() throws SchedulerException {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // ①獲取調度器中所有的觸發器組
        List<String> triggerGroups = scheduler.getTriggerGroupNames();
        // ②重新恢復在tgroup1組中,名為trigger1觸發器的運行
        for (int i = 0; i < triggerGroups.size(); i++) {
            List<String> triggers = scheduler.getTriggerGroupNames();
            for (int j = 0; j < triggers.size(); j++) {
                Trigger tg = scheduler.getTrigger(new TriggerKey(triggers
                        .get(j), triggerGroups.get(i)));
                // ②-1:根據名稱判斷
                if (tg instanceof SimpleTrigger
                        && tg.getDescription().equals("jgroup1.DEFAULT")) {//由於我們之前測試沒有設置觸發器所在組,所以默認為DEFAULT
                    // ②-1:恢復運行
                    scheduler.resumeJob(new JobKey(triggers.get(j),
                            triggerGroups.get(i)));
                }
            }
        }
        scheduler.start();

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM