spring quartz 实现动态任务

不介绍这两个框架了 。。。
介绍一下采用的环境
spring 4
quartz 2.2.1
首先配置applicationContext.xml

<!--验证只需要配置一个调度器>
 <bean id="scheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">


接下来 贴一下代码

自定义任务类
public class ScheduleJob {
/** 任务id */
    private String jobId;
 
    /** 任务名称 */
    private String jobName;
 
    /** 任务分组 */
    private String jobGroup;
 
    /** 任务状态  1启用  2暂停  3删除*/
    private String jobStatus;
 
    /** 任务运行时间表达式 */
    private String cronExpression;
 
    /** 任务描述 */
    private String desc;

public String getJobId() {
return jobId;
}

public void setJobId(String jobId) {
this.jobId = jobId;
}

public String getJobName() {
return jobName;
}

public void setJobName(String jobName) {
this.jobName = jobName;
}

public String getJobGroup() {
return jobGroup;
}

public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}

public String getJobStatus() {
return jobStatus;
}

public void setJobStatus(String jobStatus) {
this.jobStatus = jobStatus;
}

public String getCronExpression() {
return cronExpression;
}

public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}

public String getDesc() {
return desc;
}

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


//接口类(dubbo RPC 服务)
public interface  ShopQuartzService {
/**
 * 开启一个任务(如果存在 更新执行计划)
 * @param timeExpression 时间表达式 参照linux 定时任务
 * @param interfacename 接口的类名称
 * @param methodname 方法的名称
 */
public  void addQuartz(final String timeExpression,final String interfacename,final String methodname)throws Exception;

/**
 * 暂停一个定时任务
 * @param interfacename
 * @param methodname
 */
public  void  pauseJob(final String interfacename,final String methodname);
/**
 * 恢复一个定时任务
 * @param interfacename
 * @param methodname
 */
public  void   resumeJob(final String interfacename,final String methodname);
/**
 * 删除一个定时任务
 * @param interfacename
 * @param methodname
 */
public  void   deleteJob(final String interfacename,final String methodname);
/**
 * 判断是否存在
 * @param interfacename
 * @param methodname
 */
public   boolean  existJob(final String interfacename,final String methodname);
/**
 * 删除一个定时任务
 * @param interfacename
 * @param methodname
 */
public  String  existJobGetstatu(final String interfacename,final String methodname);
}



//实现类
public class  ShopQuartzimpl implements ShopQuartzService{
private static final Log log = LogFactory.getLog( ShopQuartzimpl.class );  
//所有任务的的状态类
static ClassPathXmlApplicationContext context=null;
static Scheduler scheduler=null;
//初始化容器
static{
context= new ClassPathXmlApplicationContext( new String[] { "META-INF/spring/applicationContextqa.xml" });
context.start();
scheduler=(Scheduler) context.getBean("schedulerFactoryBean");
}
public static void init(String  CronExpression,String jobname){
ScheduleJob job = new ScheduleJob();
job.setJobId(jobname);
job.setJobName(jobname);
job.setJobGroup(StaticUtil.jobprefix);
job.setJobStatus("1");
job.setCronExpression(CronExpression);
job.setDesc("shop定时任务");
try {
addJob(job);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
 * 添加任务
 * @param scheduleJob
 */
public static void addJob(ScheduleJob scheduleJob)throws Exception {
StaticUtil.jobMap.put(scheduleJob.getJobGroup() + "-" + scheduleJob.getJobName(), scheduleJob);
}
/**
 * 
 * @param timeExpression 时间表达式 参照linux 定时任务
 * @param interfacename 接口的类名称
 * @param methodname 方法的名称
 */
public  void addQuartz (final String timeExpression,final String interfacename,final String methodname)throws Exception{
String  jobname=interfacename+"-"+methodname;
init(timeExpression,jobname);
if(StaticUtil.jobMap.size()>0){
ScheduleJob job=StaticUtil.jobMap.get("shop-"+interfacename+"-"+methodname);
 
TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
 
//获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
System.err.println(triggerKey);
 
//不存在,创建一个
if (null == trigger) {
Object object =  context.getBean(interfacename);
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
             jobDetail.setTargetObject(object);
             jobDetail.setTargetMethod(methodname);
             jobDetail.setName(jobname);
             jobDetail.setConcurrent(false);
             jobDetail.setGroup(StaticUtil.jobprefix);
             jobDetail.afterPropertiesSet();
             
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
 
//按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail.getObject(),trigger);
updateQuartzState(interfacename, methodname, "1");
} else {
// Trigger已存在,那么更新相应的定时设置
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
 
//按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
//按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
}


/**
 * 暂停一个定时任务
 * @param interfacename
 * @param methodname
 */
@Override
public void pauseJob(final String interfacename,final String methodname) {
JobKey jobKey=getJobKey(interfacename, methodname);
if(null!=jobKey&&!jobKey.equals("")){
try {
scheduler.pauseJob(jobKey);
updateQuartzState(interfacename, methodname, "2");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
 * 恢复一个定时任务
 * @param interfacename
 * @param methodname
 */
@Override
public void resumeJob(final String interfacename,final String methodname) {
JobKey jobKey=getJobKey(interfacename, methodname);
if(null!=jobKey&&!jobKey.equals("")){
try {
scheduler.resumeJob(jobKey);
updateQuartzState(interfacename, methodname, "1");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
 * 删除一个定时任务
 * @param interfacename
 * @param methodname
 */
@Override
public void deleteJob(final String interfacename,final String methodname) {
JobKey jobKey=getJobKey(interfacename, methodname);
if(null!=jobKey&&!jobKey.equals("")){
try {
scheduler.deleteJob(jobKey);
updateQuartzState(interfacename, methodname, "3");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
 * 判断是否存 查询的定时任务
 */
@Override
public boolean existJob(String interfacename, String methodname) {
// TODO Auto-generated method stub
 boolean exit=false;
 //用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
 //判断任务是否注册过
 if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
 exit= StaticUtil.jobMap.containsKey(jkey);
   }
return exit;
}
/**
 * 查询是否存在 存在返回状态
 */
@Override
public String existJobGetstatu(String interfacename, String methodname) {
// TODO Auto-generated method stub
 String jobstate="";
 //用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
 //判断任务是否注册过
 if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
 if(StaticUtil.jobMap.containsKey(jkey)){
 
 jobstate=StaticUtil.jobMap.get(jkey).getJobStatus();
 
 };
   }
return jobstate;
}
/**
 * 获取作业jobkey
 * @param interfacename
 * @param methodname
 * @return
 */
public  static JobKey  getJobKey(String interfacename,String methodname){
 JobKey jobKey=null;
 //用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
 //获取jobKey
 if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
  jobKey= JobKey.jobKey(StaticUtil.jobMap.get(jkey).getJobName(),StaticUtil.jobMap.get(jkey).getJobGroup());
   }
return jobKey;
}

/**
 * 获取作业jobkey
 * @param interfacename
 * @param methodname
 * @return
 */
public  static void  updateQuartzState(String interfacename,String methodname,String state){
//用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
if(null!=StaticUtil.jobMap.get(jkey)){
StaticUtil.jobMap.get(jkey).setJobStatus(state);
}
}
}

@Autowired
public static void main(String[] args) throws Exception {
new ShopQuartzimpl().addQuartz("0/5 * * * * ?", "MyTask", "performActionA");
new ShopQuartzimpl().addQuartz("0/1 * * * * ?", "MyTask", "performActionA");
}
}



//公共资源类
public class StaticUtil {
 //所有任务的集合类
 static Map<String, ScheduleJob> jobMap = new HashMap<String, ScheduleJob>();
 //工作组前缀
 static final String jobprefix="xxxx";

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值