不介绍这两个框架了 。。。
介绍一下采用的环境
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";
}