无名阁,只为技术而生。流水不争先,争的是滔滔不绝。

(spring quartz) Spring+Quartz实现动态任务调度详解 Spring 加上 Quartz 可以实现动态任务调度 全网首发(图文详解1)

前沿技术 Micheal 5个月前 (06-12) 48次浏览 已收录 扫描二维码

(spring quartz) Spring+Quartz实现动态任务调度详解

Spring 加上 Quartz 可以实现动态任务调度。下面是一种实现方式的详细步骤以及一些代码示例。

步骤 1: 添加依赖

首先要在你的项目中添加Spring和Quartz的依赖。如果使用Maven,可以在pom.xml文件添加如下依赖:

<!-- Spring context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>你的Spring版本</version>
</dependency>

<!-- Quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>你的Quartz版本</version>
</dependency>

步骤 2: 配置Quartz

创建Quartz的配置类:

@Configuration
public class QuartzConfig {

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        // 这里可以添加自定义的JobFactory,如果有
        // schedulerFactoryBean.setJobFactory(myJobFactory);
        return schedulerFactoryBean;
    }

    @Bean
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

步骤 3: 创建任务

创建你的任务类,实现org.quartz.Job接口:

public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 这里是任务执行的代码
        System.out.println("执行自定义任务...");
    }
}

步骤 4: 编写动态添加任务的服务

创建一个服务来动态添加任务:

@Service
public class DynamicJobService {

    @Autowired
    private Scheduler scheduler;

    public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
        // 构建job信息
        Class jobClass = Class.forName(jobClassName);
        JobDetail jobDetail = JobBuilder.newJob(jobClass)
                .withIdentity(jobClassName, jobGroupName)
                .build();

        // 表达式调度构建器
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

        // 按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(jobClassName, jobGroupName)
                .withSchedule(scheduleBuilder)
                .build();

        // 交给scheduler去调度
        scheduler.scheduleJob(jobDetail, trigger);

        // 启动调度器
        if (!scheduler.isShutdown()) {
            scheduler.start();
        }
    }

    // 这里可以添加删除任务、暂停任务、恢复任务等方法
}

对于如何创建CronTrigger这里,cronExpression是一个字符串,它是Quartz的cron表达式,用于说明任务的运行计划。

步骤 5: 使用服务

@RestController
public class JobController {

    @Autowired
    private DynamicJobService jobService;

    @RequestMapping(value = "/addJob", method = RequestMethod.GET)
    public void addJob(@RequestParam String jobClassName,
                       @RequestParam String jobGroupName,
                       @RequestParam String cronExpression) throws Exception {
        jobService.addJob(jobClassName, jobGroupName, cronExpression);
    }
}

在这个例子中,通过HTTP GET请求调用/addJob接口,可以透过传递任务类名、组名和Cron表达式,动态地添加任务到调度器。

注意:这个例子仅仅是一个简化的样板代码。实现中你可能需要处理更多的异常情形,例如任务类找不到、Cron表达式不合法等问题。同时,生产环境的代码需要有相应的安全考虑,比如接口的鉴权等。
(今日头条极速版邀请码) 今日头条极速版邀请码是多少呢?今日头条极速版邀请码在哪里填写呀? 今日头条极速版邀请码概述 全网首发(图文详解1)
(永恒之蓝补丁) “永恒之蓝”(Wannacry)蠕虫全球肆虐 安装补丁的方法 预防WannaCry攻击的5步方法 全网首发(图文详解1)

喜欢 (0)
[]
分享 (0)
关于作者:
流水不争先,争的是滔滔不绝