java定时任务Quartz

1. 加入依赖

<!-- quartz坐标 -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Scheduled坐标 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>
<!-- spring tx坐标 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>

2. 实现Job类

此时@Autowired注入的为null,解决该问题见第4部分

@Component
public class TableToReleaseJob extends QuartzJobBean {

    @Autowired
    private RestTemplate restTemplate; 

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
   		// 需要执行的定时任务
    }
}

3. 写配置类


@Configuration
public class QuartzConfig {
    @Autowired
    private MyAdaptableJobFactory myAdaptableJobFactory;
	
	 @Bean
    public Scheduler scheduler(){
        return schedulerFactoryBean().getScheduler();
    }
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setTaskExecutor(schedulerThreadPool());
        // 先关联triggers
        factory.setJobFactory(myAdaptableJobFactory);

        return factory;
    }
    @Bean
    public Executor schedulerThreadPool(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors());
        executor.setQueueCapacity(Runtime.getRuntime().availableProcessors());
        return executor;
    }

// 或者如下方式配置
     // 1.Job对象
//    @Bean
//    public JobDetailFactoryBean jobDetailFactoryBean(){
//        JobDetailFactoryBean factory = new JobDetailFactoryBean();
//        // 关联自己的job类
//        factory.setJobClass(TableToReleaseJob.class);
//        return factory;
//    }
     // 2.Trigger对象 (简单的Trigger)
//    @Bean
//    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
//        SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
//        // 关联jobDetail对象
//        factory.setJobDetail(jobDetailFactoryBean.getObject());
//        // 设置触发时间 该参数表示执行的毫秒数
//        factory.setRepeatInterval(2000);
//        // 设置重复次数
//        factory.setRepeatCount(5);
//        return factory;
//    }
     // 2.Cron Trigger对象
//    @Bean
//    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
//        CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
//        factory.setJobDetail(jobDetailFactoryBean.getObject());
//        // 设置触发时间
//        factory.setCronExpression("0/10 42 22 24 12 ? 2021");
//
//        return factory;
//    }

     // 3.Scheduler对象
//    @Bean
//    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableJobFactory){
//        SchedulerFactoryBean factory = new SchedulerFactoryBean();
//
//        // 先关联triggers
//        factory.setTriggers(cronTriggerFactoryBean.getObject());
//        factory.setJobFactory(myAdaptableJobFactory);
//
//        return factory;
//    }
}

4. 解决Job的中注入为空的问题

// 使用定时器,解决注入为空的问题
@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory {

    // AutowireCapableBeanFactory 可以将一个对象添加到SpringIOC容器中,并完成该对象的注入
    @Autowired
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    // 该方法需要将实例化的任务对象手动添加到springIOC容器中完成对象注入
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object obj = super.createJobInstance(bundle);
        // 将obj添加到SpringIOC容器中,完成对象注入
        this.autowireCapableBeanFactory.autowireBean(obj);
        return obj;
    }
}

5. 使用定时任务

try{
	 //触发器
     Trigger trigger = TriggerBuilder.newTrigger()
             .startNow()//立即生效
             .withSchedule(CronScheduleBuilder.cronSchedule("0 43 11 27 12 ? 2021"))
             .build();
     // 任务Job
     JobDetail jobDetail = JobBuilder.newJob(TableToReleaseJob.class)
             .usingJobData("tableId",tableId)
             .build();
     // 开始Job
     scheduler.scheduleJob(jobDetail, trigger);
     scheduler.start();
 }catch (SchedulerException e){
     e.printStackTrace();
 }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值