`

Quartz动态控制定时任务的开启与关闭以及动态配置时间规则

阅读更多
为了能够实现对定时任务的动态控制,我将定时任务做了一个实体类,并将相关信息映射到了数据库中

 

package com.acca.entity;

/**
 * 
 * 任务实体
 * 
 * 
 * @author zhouhua, 2013-1-16
 */
public class SchedulingJob {

    public static final int JS_ENABLED = 0; // 任务启用状态
    public static final int JS_DISABLED = 1; // 任务禁用状态
    public static final int JS_DELETE = 2; // 任务已删除状态

    private String jobId; // 任务的Id,一般为所定义Bean的ID
    private String jobName; // 任务的描述
    private String jobGroup; // 任务所属组的名称
    private int jobStatus; // 任务的状态,0:启用;1:禁用;2:已删除
    private String cronExpression; // 定时任务运行时间表达式
    private String memos; // 任务描述

    /**
     * @return the jobId
     */
    public String getJobId() {
        return jobId;
    }

    /**
     * @param jobId the jobId to set
     */
    public void setJobId(String jobId) {
        this.jobId = jobId;
    }

    /**
     * @return the jobName
     */
    public String getJobName() {
        return jobName;
    }

    /**
     * @param jobName the jobName to set
     */
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    /**
     * @return the jobGroup
     */
    public String getJobGroup() {
        return jobGroup;
    }

    /**
     * @param jobGroup the jobGroup to set
     */
    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    /**
     * @return the jobStatus
     */
    public int getJobStatus() {
        return jobStatus;
    }

    /**
     * @param jobStatus the jobStatus to set
     */
    public void setJobStatus(int jobStatus) {
        this.jobStatus = jobStatus;
    }

    /**
     * @return the cronExpression
     */
    public String getCronExpression() {
        return cronExpression;
    }

    /**
     * @param cronExpression the cronExpression to set
     */
    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }

    /**
     * @return the memos
     */
    public String getMemos() {
        return memos;
    }

    /**
     * @param memos the memos to set
     */
    public void setMemos(String memos) {
        this.memos = memos;
    }

    public String getTriggerName() {
        return this.getJobId() + "Trigger";
    }

}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
	<class name="com.acca.entity.SchedulingJob" table="t_job"> 
		<id name="jobId">
			<generator class="uuid"/>
		</id>
		<property name="jobName"/>
		<property name="jobGroup"/>
		<property name="jobStatus"/>
		<property name="cronExpression"/>
		<property name="memos"/>
	</class>
</hibernate-mapping>

 

    /**
     * 启动定时任务
     * 
     * @param context
     * @param schedulingJob
     */
    protected void enabled(SchedulingJob schedulingJob) {
        try {
            CronTrigger trigger = (CronTrigger) this.scheduler.getTrigger(
                    schedulingJob.getTriggerName(), schedulingJob.getJobGroup());
            if (null == trigger) {
                // Trigger不存在,那么创建一个
                JobDetail jobDetail = new JobDetail(schedulingJob.getJobId(),
                        schedulingJob.getJobGroup(), QuartzJobBean.class);
                jobDetail.getJobDataMap().put("targetObjectId", schedulingJob.getJobId());

                trigger = new CronTrigger(schedulingJob.getTriggerName(),
                        schedulingJob.getJobGroup(), schedulingJob.getCronExpression());
                this.scheduler.scheduleJob(jobDetail, trigger);
            } else {
                // Trigger已存在,那么更新相应的定时设置
                trigger.setCronExpression(schedulingJob.getCronExpression());
                this.scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), trigger);
            }
        } catch (Exception e) {
            e.printStackTrace();
            // TODO
        }
    }
这个类我放到了service层

 

    /**
     * 禁用指定的定时任务
     * 
     * @param context
     * @param schedulingJob
     */
    protected void disabled(SchedulingJob schedulingJob) {
        try {
            Trigger trigger = this.scheduler.getTrigger(schedulingJob.getTriggerName(),
                    schedulingJob.getJobGroup());
            if (null != trigger) {
                this.scheduler.deleteJob(schedulingJob.getJobId(), schedulingJob.getJobGroup());
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            // TODO
        }
    }

 

/**
 * 
 *
 * @version sas-web v1.0
 * @author zhouhua, 2013-1-16
 */
public interface MyJob {

    public void execute();
}

 

public class QuartzJobBean implements Job {

    /**
     * @param arg0
     * @throws JobExecutionException
     * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
     */
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        String targetBeanId = (String) context.getMergedJobDataMap().get("targetObjectId");
        if (SpringUtils.isNullString(targetBeanId))
            return;
        Object targetBean = SpringUtils.getBean(targetBeanId);
        if (null == targetBean)
            return;

        // 判断是否是实现了MyJob接口
        if (!(targetBean instanceof MyJob))
            return;

        // 执行相应的任务
        ((MyJob) targetBean).execute();
    }

}

 

package com.acca.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 
 * 
 * 
 * @author zhouhua, 2013-1-16
 */
public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        this.applicationContext = applicationContext;
    }

    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }
    
    /**
     * 判断字符串是否为空
     * @param str
     * @return
     */
    public static boolean isNullString(String str){
        if("".equals(str)&&str==null){
            return true;
        }else{
            return false;
        }
    }

}

 

public class QuartzJob implements MyJob {

    public void work() {
        System.out.println("Quartz的任务调度!!!"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    /**
     * 
     * @see com.acca.task.MyJob#execute()
     */
    @Override
    public void execute() {
        work();        
    }
}

 

public class QuartzJob01 implements MyJob {

    public void work() {
        System.out.println("Quartz01的任务调度!!!"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

    /**
     * 
     * @see com.acca.task.MyJob#execute()
     */
    @Override
    public void execute() {
        work();        
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

	<bean id="scheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
	<bean id="springUtils" class="com.acca.util.SpringUtils"></bean>
	<bean id="quartzJob" class="com.acca.task.QuartzJob"></bean>
	<bean id="quartzJob01" class="com.acca.task.QuartzJob01"></bean>
</beans>
这里需要注意的是:定时任务的bean id必须和数据中的id一致否则无法获取定时任务

 

public class SystemIni implements ServletContextListener {

    private JobTaskService jobTaskService;

    /**
     * @param arg0
     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub

    }

    /**
     * 项目启动时加载所有已启动的定时任务
     * 
     * @param arg0
     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("load....");
        ServletContext context=servletContextEvent.getServletContext();
        ApplicationContext applicationContext=WebApplicationContextUtils.getWebApplicationContext(context);
        jobTaskService=(JobTaskService) applicationContext.getBean("jobTaskService");
        jobTaskService.IniLoadClass();
    }
    

}

 

我自己写了一个demo,如果有需要的朋友可以给我邮箱,我会及时给你发过去,高手勿喷,这个demo还有一些需要改进的地方,如果高手有例子的话,还望赐教啊!!!互相交流,互相进步!!,谢谢

 

  • 大小: 25.2 KB
4
0
分享到:
评论
59 楼 HuangYu_05 2017-09-20  
你好,代码麻烦发一份给我,谢谢,1007331304@qq.com
58 楼 gcsky5211 2017-08-24  
大神发我一份,425563078@qq.com
57 楼 lhfJPX 2017-06-05  
兄弟,你好!
   能给我发一份吗?274718843@qq.com
56 楼 Rokey_hansq 2016-12-24  
求一份928920125@qq.com
55 楼 gufeng 2014-11-19  
jigufengyue@163.com 谢谢
54 楼 wangtinghet 2014-08-07  
wangtingvv@126.com  谢谢
53 楼 conishyy 2014-05-08  
yangyao86@126.com 发一份给我,谢谢!
52 楼 lingjunxlj 2014-04-09  
求代码,lingjunxlj@gmail.com,多谢啦。
51 楼 FireZHFox 2014-04-01  
fhm727 写道
求代码一份,fhm727@163.com,多谢


请注意查收
50 楼 fhm727 2014-03-27  
求代码一份,fhm727@163.com,多谢
49 楼 lancui 2014-02-26  
写的很好哦,能发一份给我么?谢谢lancui19831110@163.com
48 楼 诗飘秋舞的活着 2014-02-12  
FireZHFox 写道
诗飘秋舞的活着 写道
诗飘秋舞的活着 写道
public void execute() { 
        work();         
    } 
work()里面的方法如果调用service层的方法  会发现这个注入service为null,例如调用jobTaskService里面的方法 会发现这个jobTaskService本身就是个null值


这个已经处理了,是我没有注入的原因
<bean id="quartzJob" class="com.acca.task.QuartzJob">
   <property name="jobTaskService" ref="jobTaskService"></property>
</bean>
即可。
现在又出现一个问题 我获取不到request

public class PartFourAction   extends AbstractBaseAction implements
                 ServletRequestAware,ServletResponseAware,MyTaskJob{
private HttpServletResponse response;
private HttpServletRequest request;

public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public void setServletResponse(HttpServletResponse response) {
this.response = response;
}

这个request为空
后面我直接HttpServletRequest request = ServletActionContext.getRequest();
发现这个 ServletActionContext就为空。请问如何获取到这个对象,我需要从页面上获取到数据。

你的action实现方式怎么这么复杂呢?你如果用的是struts2的话为什么不直接集成ActionSupport呢,这样应该可以获取request的。为什么要获取request呢?如果用sturts2根本就不需要request,直接在action类中定义变量并且声称set和get方法就能获取到页面上的值


extends AbstractBaseAction 这个AbstractBaseAction是已经继承了ActionSupport类的

47 楼 FireZHFox 2014-02-12  
诗飘秋舞的活着 写道
诗飘秋舞的活着 写道
public void execute() { 
        work();         
    } 
work()里面的方法如果调用service层的方法  会发现这个注入service为null,例如调用jobTaskService里面的方法 会发现这个jobTaskService本身就是个null值


这个已经处理了,是我没有注入的原因
<bean id="quartzJob" class="com.acca.task.QuartzJob">
   <property name="jobTaskService" ref="jobTaskService"></property>
</bean>
即可。
现在又出现一个问题 我获取不到request

public class PartFourAction   extends AbstractBaseAction implements
                 ServletRequestAware,ServletResponseAware,MyTaskJob{
private HttpServletResponse response;
private HttpServletRequest request;

public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public void setServletResponse(HttpServletResponse response) {
this.response = response;
}

这个request为空
后面我直接HttpServletRequest request = ServletActionContext.getRequest();
发现这个 ServletActionContext就为空。请问如何获取到这个对象,我需要从页面上获取到数据。

你的action实现方式怎么这么复杂呢?你如果用的是struts2的话为什么不直接集成ActionSupport呢,这样应该可以获取request的。为什么要获取request呢?如果用sturts2根本就不需要request,直接在action类中定义变量并且声称set和get方法就能获取到页面上的值
46 楼 诗飘秋舞的活着 2014-02-12  
诗飘秋舞的活着 写道
public void execute() { 
        work();         
    } 
work()里面的方法如果调用service层的方法  会发现这个注入service为null,例如调用jobTaskService里面的方法 会发现这个jobTaskService本身就是个null值


这个已经处理了,是我没有注入的原因
<bean id="quartzJob" class="com.acca.task.QuartzJob">
   <property name="jobTaskService" ref="jobTaskService"></property>
</bean>
即可。
现在又出现一个问题 我获取不到request

public class PartFourAction   extends AbstractBaseAction implements
                 ServletRequestAware,ServletResponseAware,MyTaskJob{
private HttpServletResponse response;
private HttpServletRequest request;

public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public void setServletResponse(HttpServletResponse response) {
this.response = response;
}

这个request为空
后面我直接HttpServletRequest request = ServletActionContext.getRequest();
发现这个 ServletActionContext就为空。请问如何获取到这个对象,我需要从页面上获取到数据。
45 楼 诗飘秋舞的活着 2014-02-11  
public void execute() { 
        work();         
    } 
work()里面的方法如果调用service层的方法  会发现这个注入service为null,例如调用jobTaskService里面的方法 会发现这个jobTaskService本身就是个null值
44 楼 奈落王 2014-01-23  
642826683@qq.com 谢谢
43 楼 tiger87 2013-12-31  
兄弟,发我一份,非常感谢,我的邮箱zhshu.0910@163.com
42 楼 FireZHFox 2013-12-27  
raregao 写道
大神发我一份啊,279026988@qq.com thanks and merry christmas


发你邮箱了,希望对你有用
41 楼 FireZHFox 2013-12-27  
诗飘秋舞的活着 写道
发一份到我邮箱 sl_phoenix@163.com
谢谢


发你邮箱了,希望对你有帮组吧
40 楼 诗飘秋舞的活着 2013-12-25  
发一份到我邮箱 sl_phoenix@163.com
谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics