多语言展示
当前在线:832今日阅读:167今日分享:16

spring quartz 安全定时任务

在集群部署环境中,使用spring quartz 实现安全定时任务
工具/原料
1

 Eclipse

2

 Jetty

方法/步骤
1

在lib目录中添加quartz-all-1.8.4.jar

2

在properties目录下创建:quartz.properties#==============================================================  #Configure Main Scheduler Properties  #==============================================================   org.quartz.scheduler.instanceName = quartzScheduler   org.quartz.scheduler.instanceId = AUTO #==============================================================  #Configure ThreadPool  #============================================================== org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 10org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true#==============================================================  #Configure JobStore  #============================================================== org.quartz.jobStore.misfireThreshold = 60000org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.maxMisfiresToHandleAtATime=10org.quartz.jobStore.isClustered = true  org.quartz.jobStore.clusterCheckinInterval = 20000

3

在WEB-INF目录下创建:applicationContext-quartz.xml                                                       

4

创建类:MyJobDetailFactoryBean.javapackage com.dell.HealthCare.common.quartz;import java.lang.reflect.Method;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.scheduling.quartz.QuartzJobBean;import com.dell.HealthCare.common.spring.SpringContextUtil;/** * 这是一个群集安全spring定时任务的FactoryBean * @author 熊焱 * @date 2013-10-20 下午02:32:00 */public class MyJobDetailFactoryBean extends QuartzJobBean { private Log log = LogFactory.getLog(getClass()); //工作的对象 private String targetObject; //工作的方法 private String targetMethod; protected void executeInternal(JobExecutionContext context) throws JobExecutionException {  try {   log.info('execute [' + targetObject + '->' + targetMethod + '] at once>>>>>>');   Object oquartzJob = SpringContextUtil.getBean(targetObject);   Method method = oquartzJob.getClass().getMethod(targetMethod);   method.invoke(oquartzJob);  } catch (Exception e) {   log.error(e);   throw new JobExecutionException(e);  } } public String getTargetObject() {  return targetObject; } public void setTargetObject(String targetObject) {  this.targetObject = targetObject; } public String getTargetMethod() {  return targetMethod; } public void setTargetMethod(String targetMethod) {  this.targetMethod = targetMethod; }}

5

创建类:QuartzJob.javapackage com.dell.HealthCare.common.quartz;import java.io.Serializable;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.dell.HealthCare.common.base.service.impl.BaseService;import com.dell.HealthCare.model.PortalUser;import com.dell.HealthCare.model.SysSmsStay;import com.dell.HealthCare.service.admin.sms.ISysSmsService;/** * 执行任务 * @author 熊焱 * @date 2013-10-20 下午02:33:19 */@Servicepublic class QuartzJob extends BaseService implements Serializable {  /**  *   */ private static final long serialVersionUID = 1L;  private Log log = LogFactory.getLog(getClass()); @Autowired private ISysSmsService sysSmsService;  public void execute() throws JobExecutionException {  log.info('start.......');  String hql1 = 'from PortalUser';  List listUser = this.getListByHql(hql1);  for(PortalUser user : listUser) {   System.out.println('--------'+user.getUsername());  }    String hql2 = 'from SysSmsStay';  List listSmsStay = sysSmsService.getListByHql(hql2);  for(SysSmsStay smsStay : listSmsStay){   System.out.println('--------'+smsStay.getSender());  }  log.info('end.......'); }}

6

最后还有12中表:DROP TABLE IF EXISTS QRTZ_JOB_LISTENERS; DROP TABLE IF EXISTS QRTZ_TRIGGER_LISTENERS; DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; DROP TABLE IF EXISTS QRTZ_LOCKS; DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; DROP TABLE IF EXISTS QRTZ_TRIGGERS; DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; DROP TABLE IF EXISTS QRTZ_CALENDARS;CREATE TABLE QRTZ_JOB_DETAILS ( JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE VARCHAR(1) NOT NULL, IS_VOLATILE VARCHAR(1) NOT NULL, IS_STATEFUL VARCHAR(1) NOT NULL, REQUESTS_RECOVERY VARCHAR(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (JOB_NAME,JOB_GROUP) );CREATE TABLE QRTZ_JOB_LISTENERS ( JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, JOB_LISTENER VARCHAR(200) NOT NULL, PRIMARY KEY (JOB_NAME,JOB_GROUP,JOB_LISTENER), FOREIGN KEY (JOB_NAME,JOB_GROUP) REFERENCES QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP) );CREATE TABLE QRTZ_TRIGGERS ( TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, IS_VOLATILE VARCHAR(1) NOT NULL, DESCRIPTION VARCHAR(250) NULL, NEXT_FIRE_TIME BIGINT(13) NULL, PREV_FIRE_TIME BIGINT(13) NULL, PRIORITY INTEGER NULL, TRIGGER_STATE VARCHAR(16) NOT NULL, TRIGGER_TYPE VARCHAR(8) NOT NULL, START_TIME BIGINT(13) NOT NULL, END_TIME BIGINT(13) NULL, CALENDAR_NAME VARCHAR(200) NULL, MISFIRE_INSTR SMALLINT(2) NULL, JOB_DATA BLOB NULL, PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (JOB_NAME,JOB_GROUP) REFERENCES QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP) );CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, REPEAT_COUNT BIGINT(7) NOT NULL, REPEAT_INTERVAL BIGINT(12) NOT NULL, TIMES_TRIGGERED BIGINT(7) NOT NULL, PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_CRON_TRIGGERS ( TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, CRON_EXPRESSION VARCHAR(200) NOT NULL, TIME_ZONE_ID VARCHAR(80), PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_BLOB_TRIGGERS ( TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, BLOB_DATA BLOB NULL, PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_TRIGGER_LISTENERS ( TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, TRIGGER_LISTENER VARCHAR(200) NOT NULL, PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_LISTENER), FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_CALENDARS ( CALENDAR_NAME VARCHAR(200) NOT NULL, CALENDAR BLOB NOT NULL, PRIMARY KEY (CALENDAR_NAME) );CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( TRIGGER_GROUP VARCHAR(200) NOT NULL, PRIMARY KEY (TRIGGER_GROUP) );CREATE TABLE QRTZ_FIRED_TRIGGERS ( ENTRY_ID VARCHAR(95) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, IS_VOLATILE VARCHAR(1) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, FIRED_TIME BIGINT(13) NOT NULL, PRIORITY INTEGER NOT NULL, STATE VARCHAR(16) NOT NULL, JOB_NAME VARCHAR(200) NULL, JOB_GROUP VARCHAR(200) NULL, IS_STATEFUL VARCHAR(1) NULL, REQUESTS_RECOVERY VARCHAR(1) NULL, PRIMARY KEY (ENTRY_ID) );CREATE TABLE QRTZ_SCHEDULER_STATE ( INSTANCE_NAME VARCHAR(200) NOT NULL, LAST_CHECKIN_TIME BIGINT(13) NOT NULL, CHECKIN_INTERVAL BIGINT(13) NOT NULL, PRIMARY KEY (INSTANCE_NAME) );CREATE TABLE QRTZ_LOCKS ( LOCK_NAME VARCHAR(40) NOT NULL, PRIMARY KEY (LOCK_NAME) );INSERT INTO QRTZ_LOCKS values('TRIGGER_ACCESS'); INSERT INTO QRTZ_LOCKS values('JOB_ACCESS'); INSERT INTO QRTZ_LOCKS values('CALENDAR_ACCESS'); INSERT INTO QRTZ_LOCKS values('STATE_ACCESS'); INSERT INTO QRTZ_LOCKS values('MISFIRE_ACCESS'); commit;

7

cronExpression配置说: 1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。               字段名                 允许的值                        允许的特殊字符                 秒                         0-59                               , - * /                 分                         0-59                               , - * /                 小时                   0-23                               , - * /                 日                         1-31                               , - * ? / L W C                 月                         1-12 or JAN-DEC          , - * /                 周几                     1-7 or SUN-SAT            , - * ? / L C #                 年 (可选字段)     empty, 1970-2099      , - * /               “?”字符:表示不确定的值               “,”字符:指定数个值               “-”字符:指定一个值的范围               “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m               “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X               “W”字符:指定离给定日期最近的工作日(周一到周五)               “#”字符:表示该月第几个周X。6#3表示该月第3个周五         2)Cron表达式范例:                 每隔5秒执行一次:*/5 * * * * ?                 每隔1分钟执行一次:0 */1 * * * ?                 每天23点执行一次:0 0 23 * * ?                 每天凌晨1点执行一次:0 0 1 * * ?                 每月1号凌晨1点执行一次:0 0 1 1 * ?                 每月最后一天23点执行一次:0 0 23 L * ?                 每周星期天凌晨1点实行一次:0 0 1 ? * L                 在26分、29分、33分执行一次:0 26,29,33 * * * ?                 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?END

注意事项

在集群环境中能保证不会重复执行

推荐信息