百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Spring Boot整合Quartz如何定义动态的Job?

yuyutoo 2024-11-01 15:55 3 浏览 0 评论

在Quartz中想要实现动态任务定义,可以通过创建任务的时候的动态灵活参数的方式来实现对于调用策略动态配置从而实现了动态执行任务的操作。下面我们就来介绍一下SpringBoot整合Quartz实现动态Job的定义。

添加依赖

在POM文件中添加Quartz和Spring Boot的依赖,如下所示。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

配置Quartz Scheduler

接下来,需要定义一个QuartzSchedulerConfig配置类,用来对Quartz Scheduler进行初始化操作,如下所示。

import org.quartz.Scheduler;
import org.quartz.spi.JobFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzSchedulerConfig {

    @Bean
    public Scheduler scheduler(JobFactory jobFactory) throws Exception {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setJobFactory(jobFactory);
        factory.afterPropertiesSet();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        return scheduler;
    }
}

定义动态Job类

继承Job接口定一个用来执行动态任务的DynamicJob类,代码如下所示。

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

@Component
public class DynamicJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        String jobParam = (String) context.getJobDetail().getJobDataMap().get("param");
        System.out.println("Dynamic Job executed with param: " + jobParam);
    }
}

定义动态Job服务类

定义一个用来处理动态Job的服务类,并且要确保DynamicJobService类有一个方法来处理任务调度,如下所示。

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DynamicJobService {

    @Autowired
    private Scheduler scheduler;

    public void scheduleDynamicJob(String jobName, String jobParam, String cronExpression) throws SchedulerException {
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("param", jobParam);

        JobDetail jobDetail = JobBuilder.newJob(DynamicJob.class)
                .withIdentity(jobName)
                .usingJobData(jobDataMap)
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(jobDetail)
                .withIdentity(jobName + "Trigger")
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                .build();

        scheduler.scheduleJob(jobDetail, trigger);
    }
}

控制层代码实现

接下来就需要创建RESTFul接口调用的控制层类,如下所示。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/jobs")
public class JobController {

    @Autowired
    private DynamicJobService dynamicJobService;

    @PostMapping("/schedule")
    public String scheduleJob(
            @RequestParam String jobName,
            @RequestParam String jobParam,
            @RequestParam String cronExpression) {
        try {
            dynamicJobService.scheduleDynamicJob(jobName, jobParam, cronExpression);
            return "Job scheduled successfully";
        } catch (Exception e) {
            return "Error scheduling job: " + e.getMessage();
        }
    }
}

创建完成之后,接下来我们就可以启动项目然后调用http://localhost:8080/api/jobs/schedule接口,并且这个接口接收了三个参数。

  • jobName: 任意任务名称,例如 "dynamicJob1"
  • jobParam: 动态参数,例如 "Dynamic Param 1"
  • cronExpression: Cron表达式,例如 "0/30 * * * * ?"

如下所示,可以发送如下的请求。

curl -X POST "http://localhost:8080/api/jobs/schedule" \
    -d "jobName=dynamicJob1" \
    -d "jobParam=Dynamic Param 1" \
    -d "cronExpression=0/30 * * * * ?"

这个请求将每30秒调度一次任务,执行 DynamicJob 的 execute 方法,并打印传递的参数 "Dynamic Param 1"。

总结

这样我们就实现了一个动态Job的发布和管理。当客户端调用了参数并且传递请求参数 jobName, jobParam, 和cronExpression传递给DynamicJobService的scheduleDynamicJob 方法之后。

在scheduleDynamicJob方法中会创建一个JobDataMap实例,并将请求参数jobParam 存储在其中,接下来创建一个JobDetail实例,并且指定DynamicJob作为逻辑处理实现类,然后通过JobDataMap来传递一个参数。

接下来就是创建了一个Trigger实例对象,通过cronExpression参数作为定时任务的触发时间,这样Quartz的Scheduler会将JobDetail和Trigger注册到调度器中。

当cronExpression参数指定的时间到了之后,就会触发任务调度,每当触发任务调度的时候,就会触发DynamicJob的execute方法,然后从 JobExecutionContext 中获取任务参数,并执行相应的逻辑。在上面的例子中展示的就是一个简单的参数打印操作。当然在实际使用场景中我们可以添加更加复杂的处理逻辑。

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: