Quartz实现简单定时任务

Quartz实现简单定时任务

一个简单的Quartz定时功能,是一个单独的定时任务而不是集群,功能非常非常简单,用的是cron表达式,在前端页面中写了个下拉框,将cron写死了,每一选项都在后端对应了写好的表达式。
在这里插入图片描述
在这里插入图片描述
本来这个switch是写在前端的,但是传参回来之后问号总是丢,就直接写在了后端。
下面这个是controller类,一个JobDetail,一个触发器,一个Scheduler

@RestController
@RequestMapping("/sjzh")
public class UpdateKtrController {
    /**
     * 启动ktr
     * @param ktrName
     */
    @GetMapping("/run/{ktrName}/{cronName}")
    public void RunKtr(@PathVariable("ktrName") String ktrName,@PathVariable("cronName") String cronName) {
        String cronEx;
        switch (cronName){
            case "每年一次":
                cronEx = "0 0 15 12 1 ? *";
                break;
            case "每月一次":
                cronEx = "0 0 0 1 * ?";
                break;
            case "每周一次":
                cronEx = "0 0 2 ? * 1";
                break;
            case "每日一次":
                cronEx = "0 53 16 * * ?";
                break;
            default:
                cronEx = "";
        }
        //定时任务具体内容
        /**
         * usingJobData用来给JobDetail中存储一些kv键值对
         */
        JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
                .usingJobData("var",ktrName)
                .withIdentity("Job1","group1")
                .build();

        //任务对应的触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1")
                .startNow()
                /*.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())*/
                .withSchedule(CronScheduleBuilder.cronSchedule(cronEx))
                .build();
        //Scheduler用来对任务进行调度,每一个Scheduler都包含一个具体的任务和触发器
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

具体的任务实现类:

public class QuartzJob implements Job {

    @Autowired
    private UpdateKtrServiceImpl updateKtrService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException{
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        String ktrName = jobDataMap.getString("var");
        updateKtrService = (UpdateKtrServiceImpl) SpringContextJobUtil.getBean("updateKtrServiceImpl");
        try {
            this.updateKtrService.RunKtr( "etl/"+ktrName+".ktr");
        } catch (KettleException e) {
            e.printStackTrace();
        }
    }
}

这里最开始的时候,我是没有写
updateKtrService = (UpdateKtrServiceImpl)SpringContextJobUtil.getBean(“updateKtrServiceImpl”);
直接调用updateKtrService,报了null对象错
再加上静态工具类SpringContextJobUtil之后,又一直在报找不到bean的错误

@Component
public class SpringContextJobUtil implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    @SuppressWarnings("static-access" )
    public void setApplicationContext(ApplicationContext contex)
            throws BeansException {
        // TODO Auto-generated method stub
        this.context = contex;
    }
    public static Object getBean(String beanName){
        return context.getBean(beanName);
    }

    public static String getMessage(String key){
        return context.getMessage(key, null, Locale.getDefault());
    }
}

又仔细检查之后,才发现调用的serviceImpl类上的Service注解名字不对!!!
修改之后终于成功。

参考文章:
https://blog.csdn.net/qq_41604862/article/details/79590688
https://blog.csdn.net/xt314159/article/details/108345027
https://www.jianshu.com/p/aff9199b4416

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值