Springboot手動添加quartz-jobs

添加pom文件

 <!-- quartz 模塊 -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.3.0</version>
        </dependency>

配置QuartzConfig

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class QuartzConfig {

    @Autowired
    private QuartzJobFactory quartzJobFactory;

    @Bean(name = "scheduler")
    public Scheduler scheduler() throws Exception {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("scheduler_Executor");
        // rejection-policy:當pool已經達到max size的時候,如何處理新任務
        // CALLER_RUNS:不在新線程中執行任務,而是有調用者所在的線程來執行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();

        SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
        factoryBean.setJobFactory(quartzJobFactory);
        factoryBean.setTaskExecutor(executor);
        factoryBean.afterPropertiesSet();
        Scheduler scheduler=factoryBean.getScheduler();
        scheduler.start();
        return scheduler;
    }
}

配置QuartzJobFactory

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

@Component
public class QuartzJobFactory extends AdaptableJobFactory {
    //這個對象Spring會幫我們自動注入進來,也屬於Spring技術範疇.
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    public Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //調用父類的方法
        Object jobInstance = super.createJobInstance(bundle);
        //進行注入,這屬於Spring的技術,不清楚的可以查看Spring的API.
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

import java.util.Date;
@DisallowConcurrentExecution
public class JobWx implements Job {
    private Logger log= LoggerFactory.getLogger(JobWx.class);

    @Autowired
    private CdpWxService cdpWxService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        System.out.println("Wx " + new Date() + jobExecutionContext);
        log.info("*****************************************{},{}" ,new Date() , jobExecutionContext);
        JobDataMap j = jobExecutionContext.getJobDetail().getJobDataMap();
        log.info("*****************************************{}" ,jobExecutionContext.getJobDetail());
        log.info("*****************************************{}" ,j);
        Scheduler scheduler = jobExecutionContext.getScheduler();
        try {
            String orderNo = String.valueOf(j.get("orderNo"));
            //TODO 修改成查詢
            if(!"null".equals(orderNo)){
                Result r =cdpWxService.selectOrder(orderNo);
                if(r.isSuc()){
                    System.out.println(scheduler.deleteJob(JobKey.jobKey(orderNo, Constant.JOB_GROUP_3)));
                }
            }
        } catch (Exception e) {
            log.error("job is error : {}",e);
            e.printStackTrace();
        }
    }

    protected void springBeanAutowiringSupport() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

}

業務邏輯

@Autowired
 private Scheduler scheduler;



public void addJob(String cusNo) throws SchedulerException {
        JobDetail jobDetail = newJob(JobWx.class).withIdentity(cusNo, Constant.JOB_GROUP_3).build();
        // Trigger the job to run now, and then repeat every 40 seconds forever
        jobDetail.getJobDataMap().put("orderNo", cusNo);
        Trigger trigger =
                newTrigger().withIdentity("wxst" + cusNo, Constant.JOB_GROUP_1).startAt(DateUtil.setSendDate(60)).withSchedule(simpleSchedule().withIntervalInSeconds(60).withRepeatCount(1)).build();
        //        // Tell quartz to schedule the job using our trigger
        scheduler.scheduleJob(jobDetail, trigger);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章