Spring+Quartz动态添加定时任务(beta)

本文介绍了一个基于Spring和Quartz实现的任务调度系统。通过自定义ScheduleTask类来配置任务属性,并利用TaskService类进行任务的添加与删除操作。示例展示了如何在Spring环境中配置Quartz并启动一个简单的定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

草稿,还带完善
本例子基于Spring3.1.1、Quartz2.2.1
项目结构如下:
这里写图片描述

1、首先在applicationContext.xml文件中配置bean文件
“`

package com.ims.scheduler;

public class ScheduleTask {
    private String id;
    private String parentId = "";
    private String name = "";
    private String desc = "";
    private int planExe = 0;
    private String group = "";//规定是执行的类名
    private String groupDesc = "";
    private String cron = "";
    private String cronDesc = "";
    private String trigger = "";//规定是执行的方法名
    private String triggerDesc = "";
    private int execute = 0;
    private Long lastExeTime = 0L;
    private Long lastFinishTime = 0L;
    private int state = 1;
    private int deply = 0;

    public ScheduleTask(String taskId){
        this.id = taskId;
    }

    //setter,getter
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public int getPlanExe() {
        return planExe;
    }

    public void setPlanExe(int planExe) {
        this.planExe = planExe;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public String getGroupDesc() {
        return groupDesc;
    }

    public void setGroupDesc(String groupDesc) {
        this.groupDesc = groupDesc;
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron;
    }

    public String getCronDesc() {
        return cronDesc;
    }

    public void setCronDesc(String cronDesc) {
        this.cronDesc = cronDesc;
    }

    public String getTrigger() {
        return trigger;
    }

    public void setTrigger(String trigger) {
        this.trigger = trigger;
    }

    public String getTriggerDesc() {
        return triggerDesc;
    }

    public void setTriggerDesc(String triggerDesc) {
        this.triggerDesc = triggerDesc;
    }

    public int getExecute() {
        return execute;
    }

    public void setExecute(int execute) {
        this.execute = execute;
    }

    public Long getLastExeTime() {
        return lastExeTime;
    }

    public void setLastExeTime(Long lastExeTime) {
        this.lastExeTime = lastExeTime;
    }

    public Long getLastFinishTime() {
        return lastFinishTime;
    }

    public void setLastFinishTime(Long lastFinishTime) {
        this.lastFinishTime = lastFinishTime;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public int getDeply() {
        return deply;
    }

    public void setDeply(int deply) {
        this.deply = deply;
    }



}

3、管理任务类TaskService

package com.ims.service;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;

import com.ims.scheduler.ScheduleTask;

@Component
public class TaskService {//implements ApplicationContextAware
    @Autowired
    @Qualifier("schedulerFactoryBean")
    private SchedulerFactoryBean schedulerFactory;

    private Scheduler scheduler = schedulerFactory.getScheduler();

    @SuppressWarnings("unchecked")
    public int addTask(ScheduleTask task) throws ClassNotFoundException, SchedulerException{
//      Scheduler scheduler = schedulerFactory.getScheduler();

//      JobDetail taskDetail = new JobDetail(task.getId(),task.getGroup(),ProxyJob.class);
//      CronTrigger trigger = new CronTrigger(task.getId(),task.getTrigger());
//      trigger.setCronExpression(task.getCron());

        Class<?> clazz = Class.forName(task.getGroup());
        JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) clazz).withIdentity(task.getId(), task.getGroup()).build();// 构建job信息
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(task.getCron());// 表达式调度构建器
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(task.getId(), task.getGroup()).withSchedule(cronScheduleBuilder).build();// 按cronExpression表达式构建trigger

        scheduler.scheduleJob(jobDetail, trigger);//设置定时任务

        if(!scheduler.isShutdown()){
            scheduler.start();
        }

        return 0;
    }

    public int addTask(String taskName,String taskClassName,String cron) throws ClassNotFoundException, SchedulerException{
        Class<?> clazz = Class.forName(taskClassName);
        ScheduleTask task = new ScheduleTask(""+System.currentTimeMillis());//taskId号默认为创建时间
        task.setGroup(clazz.getName());//处理类
        task.setName(taskName);//任务名称,暂时没有意义
        task.setCron(cron);
        return addTask(task);
    }

    public int deleteTask(ScheduleTask task) throws SchedulerException{
        scheduler.deleteJob(JobKey.jobKey(task.getId(), task.getGroup()));
        return 0;
    }

//  public ScheduleTask addTask(String taskName,String taskClassName,String cron) throws ClassNotFoundException, SchedulerException{
//      Class<?> clazz = Class.forName(taskClassName);
//      ScheduleTask task = createSchedulerTask(clazz);
//      task.setName(taskName);//任务名称,暂时没有意义
//      task.setCron(cron);
//      return addTask(task);
//  }

//  private ScheduleTask createSchedulerTask(Class<?> clazz) {
//      ScheduleTask task = new ScheduleTask(""+System.currentTimeMillis());//taskId号默认为创建时间
//      task.setGroup(clazz.getName());
//      return task;
//  }

//  public ScheduleTask addTask(String taskName,String taskClassName,String triggerName,String cron) throws Exception{
//      Class<?> clazz = Class.forName(taskClassName);
//      Method m = clazz.getMethod(triggerName);
//      ScheduleTask task = createSchedulerTask(m);
//      task.setName(taskName);
//      task.setCron(cron);
//      return addTask(task);
//  }
//  
//  private ScheduleTask createSchedulerTask(Method m) {
//      ScheduleTask task = new ScheduleTask(""+System.currentTimeMillis());
//      
//      Class<?> clazz = m.getDeclaringClass();
//      task.setGroup(clazz.getName());
//      task.setTrigger(clazz.getName()+"."+m.getName());
//      
//      return task;
//  }
}

4、待执行的任务内容

package com.ims.scheduler;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyTask implements Job{
//  public void exe(){
//      System.out.println("======执行定时任务=======");
//  }

//  @Override
//  public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//        JobParameter jobParam = (JobParameter) jobExecutionContext.getJobDetail().getJobDataMap()
//                .get(JobParameter.JOB_PARAM);
//        if (jobParam != null) {
//            System.out.println(jobParam.getDescription());
//        } else {
//            System.out.println("Hey, can't find job parameter ...:)");
//        }
//    }

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("<<<<<<<<<<>>>>>>>>>>>");
    }
}

5、测试action类

package com.ims.action;


import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import com.alibaba.fastjson.JSON;
import com.ims.bean.LoginInfo;
import com.ims.dao.LoginDao;
import com.ims.scheduler.JobParameter;
import com.ims.scheduler.MyJob;
import com.ims.scheduler.ScheduleTask;
import com.ims.service.TaskService;
import com.opensymphony.xwork2.ActionSupport;

@Component
public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 129849811686835841L;

    @Autowired
    private TaskService taskService;

    @Autowired
    @Qualifier("schedulerFactoryBean")
    private SchedulerFactoryBean schedulerFactory;

    private transient LoginInfo loginInfo; 
    public String check(){
        testAddJob();
        return "init";
    }

    public void testAddJob(){
        try {
//          ScheduleTask task = taskService.addTask("新建任务", "com.ims.scheduler.MyTask", "exe", "0/1 * * * * ?");
//          ScheduleTask task = taskService.addTask("新建任务", "com.ims.scheduler.MyTask", "0/1 * * * * ?");
            int result = taskService.addTask("新建任务", "com.ims.scheduler.MyTask", "0/1 * * * * ?");
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public LoginInfo getLoginInfo() {
        return loginInfo;
    }
    public void setLoginInfo(LoginInfo loginInfo) {
        this.loginInfo = loginInfo;
    }



}

参考文献:

http://sulaohuai.blog.51cto.com/10674946/1702625
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值