Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年9月6日

http://www.cnblogs.com/fanshuyao/

 

一、Spring整合Quartz

使用的是spring4:4.3.9.RELEASE,Quartz2:2.2.3

 

二、引用Quartz 的Jar包

maven方式:(Spring不说了)

Xml代码  收藏代码
  1. <dependency>  
  2.     <groupId>org.quartz-scheduler</groupId>  
  3.     <artifactId>quartz</artifactId>  
  4.     <version>${quartz.version}</version>  
  5.     </dependency>  
  6. <dependency>  
  7.     <groupId>org.quartz-scheduler</groupId>  
  8.     <artifactId>quartz-jobs</artifactId>  
  9.     <version>${quartz.version}</version>  
  10. </dependency>  

 

三、在数据库创建Quartz 相关的表(下面的数据库为:tables_mysql_innodb.sql),先创建表,然后再执下面的索引,避免警告。(更多表见http://fanshuyao.iteye.com/blog/2392350)

Java代码  收藏代码
  1. #  
  2. # In your Quartz properties file, you'll need to set   
  3. # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
  4. #  
  5. #  
  6. # By: Ron Cordell - roncordell  
  7. #  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.  
  8.   
  9. DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;  
  10. DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;  
  11. DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;  
  12. DROP TABLE IF EXISTS QRTZ_LOCKS;  
  13. DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;  
  14. DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;  
  15. DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;  
  16. DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;  
  17. DROP TABLE IF EXISTS QRTZ_TRIGGERS;  
  18. DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;  
  19. DROP TABLE IF EXISTS QRTZ_CALENDARS;  
  20.   
  21. CREATE TABLE QRTZ_JOB_DETAILS(  
  22. SCHED_NAME VARCHAR(120) NOT NULL,  
  23. JOB_NAME VARCHAR(200) NOT NULL,  
  24. JOB_GROUP VARCHAR(200) NOT NULL,  
  25. DESCRIPTION VARCHAR(250) NULL,  
  26. JOB_CLASS_NAME VARCHAR(250) NOT NULL,  
  27. IS_DURABLE VARCHAR(1) NOT NULL,  
  28. IS_NONCONCURRENT VARCHAR(1) NOT NULL,  
  29. IS_UPDATE_DATA VARCHAR(1) NOT NULL,  
  30. REQUESTS_RECOVERY VARCHAR(1) NOT NULL,  
  31. JOB_DATA BLOB NULL,  
  32. PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))  
  33. ENGINE=InnoDB;  
  34.   
  35. CREATE TABLE QRTZ_TRIGGERS (  
  36. SCHED_NAME VARCHAR(120) NOT NULL,  
  37. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  38. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  39. JOB_NAME VARCHAR(200) NOT NULL,  
  40. JOB_GROUP VARCHAR(200) NOT NULL,  
  41. DESCRIPTION VARCHAR(250) NULL,  
  42. NEXT_FIRE_TIME BIGINT(13) NULL,  
  43. PREV_FIRE_TIME BIGINT(13) NULL,  
  44. PRIORITY INTEGER NULL,  
  45. TRIGGER_STATE VARCHAR(16) NOT NULL,  
  46. TRIGGER_TYPE VARCHAR(8) NOT NULL,  
  47. START_TIME BIGINT(13) NOT NULL,  
  48. END_TIME BIGINT(13) NULL,  
  49. CALENDAR_NAME VARCHAR(200) NULL,  
  50. MISFIRE_INSTR SMALLINT(2) NULL,  
  51. JOB_DATA BLOB NULL,  
  52. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  53. FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)  
  54. REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))  
  55. ENGINE=InnoDB;  
  56.   
  57. CREATE TABLE QRTZ_SIMPLE_TRIGGERS (  
  58. SCHED_NAME VARCHAR(120) NOT NULL,  
  59. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  60. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  61. REPEAT_COUNT BIGINT(7) NOT NULL,  
  62. REPEAT_INTERVAL BIGINT(12) NOT NULL,  
  63. TIMES_TRIGGERED BIGINT(10) NOT NULL,  
  64. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  65. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  
  66. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  67. ENGINE=InnoDB;  
  68.   
  69. CREATE TABLE QRTZ_CRON_TRIGGERS (  
  70. SCHED_NAME VARCHAR(120) NOT NULL,  
  71. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  72. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  73. CRON_EXPRESSION VARCHAR(120) NOT NULL,  
  74. TIME_ZONE_ID VARCHAR(80),  
  75. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  76. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  
  77. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  78. ENGINE=InnoDB;  
  79.   
  80. CREATE TABLE QRTZ_SIMPROP_TRIGGERS  
  81.   (            
  82.     SCHED_NAME VARCHAR(120) NOT NULL,  
  83.     TRIGGER_NAME VARCHAR(200) NOT NULL,  
  84.     TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  85.     STR_PROP_1 VARCHAR(512) NULL,  
  86.     STR_PROP_2 VARCHAR(512) NULL,  
  87.     STR_PROP_3 VARCHAR(512) NULL,  
  88.     INT_PROP_1 INT NULL,  
  89.     INT_PROP_2 INT NULL,  
  90.     LONG_PROP_1 BIGINT NULL,  
  91.     LONG_PROP_2 BIGINT NULL,  
  92.     DEC_PROP_1 NUMERIC(13,4) NULL,  
  93.     DEC_PROP_2 NUMERIC(13,4) NULL,  
  94.     BOOL_PROP_1 VARCHAR(1) NULL,  
  95.     BOOL_PROP_2 VARCHAR(1) NULL,  
  96.     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  97.     FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)   
  98.     REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  99. ENGINE=InnoDB;  
  100.   
  101. CREATE TABLE QRTZ_BLOB_TRIGGERS (  
  102. SCHED_NAME VARCHAR(120) NOT NULL,  
  103. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  104. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  105. BLOB_DATA BLOB NULL,  
  106. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  107. INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),  
  108. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  
  109. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  110. ENGINE=InnoDB;  
  111.   
  112. CREATE TABLE QRTZ_CALENDARS (  
  113. SCHED_NAME VARCHAR(120) NOT NULL,  
  114. CALENDAR_NAME VARCHAR(200) NOT NULL,  
  115. CALENDAR BLOB NOT NULL,  
  116. PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))  
  117. ENGINE=InnoDB;  
  118.   
  119. CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (  
  120. SCHED_NAME VARCHAR(120) NOT NULL,  
  121. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  122. PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))  
  123. ENGINE=InnoDB;  
  124.   
  125. CREATE TABLE QRTZ_FIRED_TRIGGERS (  
  126. SCHED_NAME VARCHAR(120) NOT NULL,  
  127. ENTRY_ID VARCHAR(95) NOT NULL,  
  128. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  129. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  130. INSTANCE_NAME VARCHAR(200) NOT NULL,  
  131. FIRED_TIME BIGINT(13) NOT NULL,  
  132. SCHED_TIME BIGINT(13) NOT NULL,  
  133. PRIORITY INTEGER NOT NULL,  
  134. STATE VARCHAR(16) NOT NULL,  
  135. JOB_NAME VARCHAR(200) NULL,  
  136. JOB_GROUP VARCHAR(200) NULL,  
  137. IS_NONCONCURRENT VARCHAR(1) NULL,  
  138. REQUESTS_RECOVERY VARCHAR(1) NULL,  
  139. PRIMARY KEY (SCHED_NAME,ENTRY_ID))  
  140. ENGINE=InnoDB;  
  141.   
  142. CREATE TABLE QRTZ_SCHEDULER_STATE (  
  143. SCHED_NAME VARCHAR(120) NOT NULL,  
  144. INSTANCE_NAME VARCHAR(200) NOT NULL,  
  145. LAST_CHECKIN_TIME BIGINT(13) NOT NULL,  
  146. CHECKIN_INTERVAL BIGINT(13) NOT NULL,  
  147. PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))  
  148. ENGINE=InnoDB;  
  149.   
  150. CREATE TABLE QRTZ_LOCKS (  
  151. SCHED_NAME VARCHAR(120) NOT NULL,  
  152. LOCK_NAME VARCHAR(40) NOT NULL,  
  153. PRIMARY KEY (SCHED_NAME,LOCK_NAME))  
  154. ENGINE=InnoDB;  
  155.   
  156.   
  157.   
  158. -- 这是是索引了--------------------------------------------  
  159. CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);  
  160. CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);  
  161.   
  162. CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);  
  163. CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);  
  164. CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);  
  165. CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);  
  166. CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);  
  167. CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);  
  168. CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);  
  169. CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);  
  170. CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);  
  171. CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);  
  172. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);  
  173. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);  
  174.   
  175. CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);  
  176. CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);  
  177. CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);  
  178. CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);  
  179. CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);  
  180. CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);  
  181.   
  182. commit;   

 

四、新建一个Quartz相关的Properties文件:spring-quartz.properties,此配置为官网例子的配置

Java代码  收藏代码
  1. #配置见:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering.html  
  2. #============================================================================  
  3. # Configure Main Scheduler Properties    
  4. #============================================================================  
  5.   
  6. org.quartz.scheduler.instanceName = MyClusteredScheduler  
  7. org.quartz.scheduler.instanceId = AUTO  
  8.   
  9. #============================================================================  
  10. # Configure ThreadPool    
  11. #============================================================================  
  12.   
  13. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  14. org.quartz.threadPool.threadCount = 25  
  15. org.quartz.threadPool.threadPriority = 5  
  16.   
  17. #============================================================================  
  18. # Configure JobStore    
  19. #============================================================================  
  20.   
  21. org.quartz.jobStore.misfireThreshold = 60000  
  22.   
  23. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
  24. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
  25. org.quartz.jobStore.useProperties = false  
  26. org.quartz.jobStore.dataSource = myDS  
  27. org.quartz.jobStore.tablePrefix = QRTZ_  
  28.   
  29. org.quartz.jobStore.isClustered = true  
  30. org.quartz.jobStore.clusterCheckinInterval = 20000  

 

五、整合Spring和Quartz,在Spring.xml配置

Java代码  收藏代码
  1. <bean id="customJobFactory" class="cn.imovie.manage.task.job.CustomJobFactory"></bean>  
  2.      <!-- 定时任务配置 start -->  
  3.     <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
  4.         <property name="dataSource" ref="dataSource"></property>      
  5.         <!-- 可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->        
  6.         <property name="overwriteExistingJobs" value="true" />        
  7.          <!-- 必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动  -->     
  8.         <property name="startupDelay" value="2" />      
  9.         <!-- 设置自动启动  -->     
  10.         <property name="autoStartup" value="true" />    
  11.         <property name="jobFactory" ref="customJobFactory"></property>  
  12.         <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />  
  13.         <property name="configLocation" value="classpath:spring-quartz.properties" />        
  14.     </bean>  
  15.     <!-- 定时任务配置 end -->  

 

其中customJobFactory 是为了解决Spring quartz Job不能依赖注入。

代码如下:

Java代码  收藏代码
  1. import org.quartz.spi.TriggerFiredBundle;  
  2. import org.springframework.beans.factory.annotation.Autowired;  
  3. import org.springframework.beans.factory.config.AutowireCapableBeanFactory;  
  4. import org.springframework.scheduling.quartz.SpringBeanJobFactory;  
  5.   
  6. public class CustomJobFactory extends SpringBeanJobFactory{  
  7.   
  8.     @Autowired    
  9.     private AutowireCapableBeanFactory capableBeanFactory;    
  10.     
  11.     @Override    
  12.     protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {    
  13.         //调用父类的方法    
  14.         Object jobInstance = super.createJobInstance(bundle);    
  15.         //进行注入    
  16.         capableBeanFactory.autowireBean(jobInstance);    
  17.         return jobInstance;    
  18.     }  
  19.       
  20. }  

 

六、Quartz定时任务主代码:

Java代码  收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.Date;  
  3. import java.util.List;  
  4. import java.util.Set;  
  5.   
  6. import org.quartz.CronScheduleBuilder;  
  7. import org.quartz.CronTrigger;  
  8. import org.quartz.Job;  
  9. import org.quartz.JobBuilder;  
  10. import org.quartz.JobDetail;  
  11. import org.quartz.JobExecutionContext;  
  12. import org.quartz.JobKey;  
  13. import org.quartz.Scheduler;  
  14. import org.quartz.SchedulerException;  
  15. import org.quartz.SimpleScheduleBuilder;  
  16. import org.quartz.SimpleTrigger;  
  17. import org.quartz.Trigger;  
  18. import org.quartz.TriggerBuilder;  
  19. import org.quartz.TriggerKey;  
  20. import org.quartz.impl.matchers.GroupMatcher;  
  21. import org.slf4j.Logger;  
  22. import org.slf4j.LoggerFactory;  
  23. import org.springframework.beans.factory.annotation.Autowired;  
  24. import org.springframework.stereotype.Repository;  
  25.   
  26. import cn.imovie.common.utils.CC;  
  27. import cn.imovie.common.utils.DateUtils;  
  28. import cn.imovie.common.utils.JasonUtils;  
  29. import cn.imovie.common.utils.StrUtils;  
  30. import cn.imovie.dao.SchedulerManageDao;  
  31. import cn.imovie.entity.task.ScheduleJob;  
  32.   
  33. @Repository  
  34. public class SchedulerManageDaoImpl implements SchedulerManageDao{  
  35.   
  36.     private Logger log = LoggerFactory.getLogger(SchedulerManageDaoImpl.class);  
  37.       
  38.     @Autowired  
  39.     private Scheduler scheduler;  
  40.       
  41.     /** 
  42.      * 新增任务 
  43.      * @param scheduleJob 
  44.      */  
  45.     @Override  
  46.     public void add(ScheduleJob scheduleJob)  throws Exception{  
  47.         if(!StrUtils.isBlank(scheduleJob.getCronExpression())){  
  48.             this.addJobCron(scheduleJob);  
  49.         }else{  
  50.             this.addJobSimple(scheduleJob);  
  51.         }  
  52.     }  
  53.       
  54.     /** 
  55.      * 更新任务 
  56.      * @param scheduleJob 
  57.      */  
  58.     @Override  
  59.     public void update(ScheduleJob scheduleJob)  throws Exception{  
  60.         if(!StrUtils.isBlank(scheduleJob.getCronExpression())){  
  61.             this.updateJobCron(scheduleJob);  
  62.         }else{  
  63.             this.updateJobSimple(scheduleJob);  
  64.         }  
  65.     }  
  66.       
  67.     /** 
  68.      * 新增任务 
  69.      * @param scheduleJob 
  70.      * @throws Exception  
  71.      */  
  72.     @SuppressWarnings("unchecked")  
  73.     @Override  
  74.     public void addJobCron(ScheduleJob scheduleJob) throws Exception{  
  75.         TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  76.         //任务触发  
  77.         Trigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);  
  78.         if (null == trigger) {  
  79.             JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(scheduleJob.getClazz()))  
  80.               .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build();  
  81.             jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);  
  82.               
  83.             CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());  
  84.             /*withMisfireHandlingInstructionDoNothing 
  85.             ——不触发立即执行 
  86.             ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行 
  87.  
  88.             withMisfireHandlingInstructionIgnoreMisfires 
  89.             ——以错过的第一个频率时间立刻开始执行 
  90.             ——重做错过的所有频率周期后 
  91.             ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行 
  92.  
  93.             withMisfireHandlingInstructionFireAndProceed 
  94.             ——以当前时间为触发频率立刻触发一次执行 
  95.             ——然后按照Cron频率依次执行*/  
  96.             trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).withSchedule(cronScheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();  
  97.             scheduler.scheduleJob(jobDetail, trigger);  
  98.             log.info(CC.LOG_PREFIX + "新增Cron任务:"+JasonUtils.Object2String(scheduleJob));  
  99.         }else {  
  100.             // Trigger已存在,那么更新相应的定时设置  
  101.             //表达式调度构建器  
  102.             /*CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); 
  103.             //按新的cronExpression表达式重新构建trigger 
  104.             trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build(); 
  105.             JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); 
  106.             JobDetail jobDetail = scheduler.getJobDetail(jobKey); 
  107.             jobDetail.getJobDataMap().put("scheduleJob", scheduleJob); 
  108.             //按新的trigger重新设置job执行 
  109.             scheduler.rescheduleJob(triggerKey, trigger); 
  110.             log.info(CC.LOG_PREFIX + "任务"+JasonUtils.Object2String(scheduleJob)+"已经存在,更新trigger");*/  
  111.               
  112.             this.updateJobCron(scheduleJob);  
  113.         }  
  114.     }  
  115.       
  116.     /** 
  117.      * 更新任务的时间表达式 
  118.      * @param scheduleJob 
  119.      */  
  120.     @Override  
  121.     public void updateJobCron(ScheduleJob scheduleJob) throws Exception{  
  122.         /*TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); 
  123.  
  124.         //获取trigger,即在spring配置文件中定义的 bean id="myTrigger" 
  125.         CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); 
  126.  
  127.         //表达式调度构建器 
  128.         CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); 
  129.  
  130.         //按新的cronExpression表达式重新构建trigger 
  131.         trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build(); 
  132.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); 
  133.         JobDetail jobDetail = scheduler.getJobDetail(jobKey); 
  134.         jobDetail.getJobDataMap().put("scheduleJob", scheduleJob); 
  135.         //按新的trigger重新设置job执行 
  136.         scheduler.rescheduleJob(triggerKey, trigger);*/  
  137.           
  138.           
  139.         //为什么要删除再新增呢?因为不这样,JobDetail的JobDataMap不更新。注解什么都试过了,没起作用。  
  140.         this.deleteJob(scheduleJob);  
  141.         this.addJobCron(scheduleJob);  
  142.         log.info(CC.LOG_PREFIX + "更新Cron任务(先删除再更新):"+JasonUtils.Object2String(scheduleJob));  
  143.     }  
  144.       
  145.     /** 
  146.      * 新增任务 
  147.      * @param scheduleJob 
  148.      * @throws Exception  
  149.      */  
  150.     @Override  
  151.     @SuppressWarnings("unchecked")  
  152.     public void addJobSimple(ScheduleJob scheduleJob) throws Exception{  
  153.         TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  154.         //任务触发  
  155.         SimpleTrigger trigger = (SimpleTrigger) scheduler.getTrigger(triggerKey);  
  156.         if (null == trigger) {  
  157.             JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(scheduleJob.getClazz()))  
  158.               .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build();  
  159.             jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);  
  160.               
  161.             SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule();  
  162.             Date triggerStartTime = new Date();  
  163.             if("秒".equals(scheduleJob.getTimeType()) ||   
  164.                     "second".equalsIgnoreCase(scheduleJob.getTimeType())){  
  165.                 simpleScheduleBuilder.withIntervalInSeconds(scheduleJob.getTimeValue());  
  166.                 triggerStartTime = DateUtils.dateAddSeconds(triggerStartTime, scheduleJob.getTimeValue());  
  167.             }else if("分".equals(scheduleJob.getTimeType()) || "分钟".equals(scheduleJob.getTimeType()) ||   
  168.                     "minute".equalsIgnoreCase(scheduleJob.getTimeType())){  
  169.                 simpleScheduleBuilder.withIntervalInMinutes(scheduleJob.getTimeValue());  
  170.                 triggerStartTime = DateUtils.dateAddMinutes(triggerStartTime, scheduleJob.getTimeValue());  
  171.             }else if("时".equals(scheduleJob.getTimeType()) || "小时".equals(scheduleJob.getTimeType()) ||   
  172.                     "hour".equalsIgnoreCase(scheduleJob.getTimeType())){  
  173.                 simpleScheduleBuilder.withIntervalInHours(scheduleJob.getTimeValue());  
  174.                 triggerStartTime = DateUtils.dateAddHours(triggerStartTime, scheduleJob.getTimeValue());  
  175.             }else if("天".equals(scheduleJob.getTimeType()) ||   
  176.                     "date".equalsIgnoreCase(scheduleJob.getTimeType())){  
  177.                 simpleScheduleBuilder.withIntervalInHours(scheduleJob.getTimeValue()*24);//2017-09-15修正问题,少了24  
  178.                 triggerStartTime = DateUtils.dateAddDays(triggerStartTime, scheduleJob.getTimeValue());  
  179.             }  
  180.               
  181.             trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup())  
  182.                     .startAt(triggerStartTime).withSchedule(simpleScheduleBuilder.repeatForever().withMisfireHandlingInstructionNextWithRemainingCount()).build();  
  183.             scheduler.scheduleJob(jobDetail, trigger);  
  184.             log.info(CC.LOG_PREFIX + "新增简单任务:"+JasonUtils.Object2String(scheduleJob));  
  185.         }else {  
  186.             this.updateJobCron(scheduleJob);  
  187.         }  
  188.     }  
  189.       
  190.     /** 
  191.      * 更新任务的时间表达式 
  192.      * @param scheduleJob 
  193.      * @throws Exception  
  194.      */  
  195.     @Override  
  196.     public void updateJobSimple(ScheduleJob scheduleJob) throws Exception{  
  197.         //为什么要删除再新增呢?因为不这样,JobDetail的JobDataMap不更新。注解什么都试过了,没起作用。  
  198.         this.deleteJob(scheduleJob);  
  199.         this.addJobSimple(scheduleJob);  
  200.         log.info(CC.LOG_PREFIX + "更新简单任务(先删除再更新):"+JasonUtils.Object2String(scheduleJob));  
  201.     }  
  202.       
  203.       
  204.       
  205.     /** 
  206.      * 暂停任务 
  207.      * @param scheduleJob 
  208.      * @throws Exception  
  209.      */  
  210.     @Override  
  211.     public void pauseJob(ScheduleJob scheduleJob) throws Exception{  
  212.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  213.         scheduler.pauseJob(jobKey);  
  214.         log.info(CC.LOG_PREFIX + "暂停任务:"+JasonUtils.Object2String(scheduleJob));  
  215.     }  
  216.       
  217.     /** 
  218.      * 暂停全部任务 
  219.      * @throws SchedulerException  
  220.      */  
  221.     @Override  
  222.     public void pauseAll() throws Exception{  
  223.         scheduler.pauseAll();  
  224.         log.info(CC.LOG_PREFIX + "暂停所有任务");  
  225.     }  
  226.       
  227.     /** 
  228.      * 恢复任务 
  229.      * @param scheduleJob 
  230.      * @throws Exception  
  231.      */  
  232.     @Override  
  233.     public void resumeJob(ScheduleJob scheduleJob) throws Exception{  
  234.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  235.         scheduler.resumeJob(jobKey);  
  236.         log.info(CC.LOG_PREFIX + "恢复任务:"+JasonUtils.Object2String(scheduleJob));  
  237.     }  
  238.       
  239.       
  240.     /** 
  241.      * 恢复所有任务 
  242.      * @throws Exception  
  243.      */  
  244.     @Override  
  245.     public void resumeAll() throws Exception{  
  246.         scheduler.resumeAll();  
  247.         log.info(CC.LOG_PREFIX + "恢复所有任务");  
  248.     }  
  249.       
  250.     /** 
  251.      * 删除任务后,所对应的trigger也将被删除 
  252.      * @param scheduleJob 
  253.      * @throws Exception  
  254.      */  
  255.     @Override  
  256.     public void deleteJob(ScheduleJob scheduleJob) throws Exception{  
  257.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  258.         scheduler.pauseJob(jobKey);//先暂停任务  
  259.         scheduler.deleteJob(jobKey);//再删除任务  
  260.         log.info(CC.LOG_PREFIX + "删除任务:"+JasonUtils.Object2String(scheduleJob));  
  261.     }  
  262.       
  263.     /** 
  264.      * 立即运行任务 
  265.      * @param scheduleJob 
  266.      * @throws Exception  
  267.      */  
  268.     @Override  
  269.     public void triggerJob(ScheduleJob scheduleJob) throws Exception{  
  270.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  271.         scheduler.triggerJob(jobKey);  
  272.         log.info(CC.LOG_PREFIX + "运行任务:"+JasonUtils.Object2String(scheduleJob));  
  273.     }  
  274.       
  275.       
  276.     /** 
  277.      * 获取quartz调度器的计划任务 
  278.      * @return 
  279.      */  
  280.     @Override  
  281.     public List<ScheduleJob> getScheduleJobList(){  
  282.         List<ScheduleJob> jobList = null;  
  283.         try {  
  284.             GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();  
  285.             Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);  
  286.             jobList = new ArrayList<ScheduleJob>();  
  287.             for (JobKey jobKey : jobKeys) {  
  288.                 List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);  
  289.                 for (Trigger trigger : triggers) {  
  290.                     ScheduleJob job = new ScheduleJob();  
  291.                     job.setJobName(jobKey.getName());  
  292.                     job.setJobGroup(jobKey.getGroup());  
  293.                     job.setClazz(jobKey.getClass().toString());  
  294.                     job.setJobDesc("触发器:" + trigger.getKey());  
  295.                     Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());  
  296.                     job.setJobStatus(triggerState.name());  
  297.                     if (trigger instanceof CronTrigger) {  
  298.                         CronTrigger cronTrigger = (CronTrigger) trigger;  
  299.                         String cronExpression = cronTrigger.getCronExpression();  
  300.                         job.setCronExpression(cronExpression);  
  301.                     }else if(trigger instanceof SimpleTrigger){  
  302.                         SimpleTrigger simpleTrigger = (SimpleTrigger) trigger;  
  303.                         long milliseconds = simpleTrigger.getRepeatInterval();  
  304.                         job.setTimeValue((int) (milliseconds/1000));  
  305.                     }  
  306.                     jobList.add(job);  
  307.                 }  
  308.             }  
  309.         } catch (Exception e) {  
  310.             e.printStackTrace();  
  311.         }  
  312.         return jobList;  
  313.     }  
  314.       
  315.     /** 
  316.      * 获取quartz调度器的运行任务 
  317.      * @return 
  318.      */  
  319.     @Override  
  320.     public List<ScheduleJob> getScheduleJobRunningList(){  
  321.         List<ScheduleJob> jobList = null;  
  322.         try {  
  323.             List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();  
  324.             jobList = new ArrayList<ScheduleJob>(executingJobs.size());  
  325.             for (JobExecutionContext executingJob : executingJobs) {  
  326.               ScheduleJob job = new ScheduleJob();  
  327.               JobDetail jobDetail = executingJob.getJobDetail();  
  328.               JobKey jobKey = jobDetail.getKey();  
  329.               Trigger trigger = executingJob.getTrigger();  
  330.               job.setJobName(jobKey.getName());  
  331.               job.setJobGroup(jobKey.getGroup());  
  332.               job.setClazz(jobKey.getClass().toString());  
  333.               job.setJobDesc("触发器:" + trigger.getKey());  
  334.               Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());  
  335.               job.setJobStatus(triggerState.name());  
  336.               if (trigger instanceof CronTrigger) {  
  337.                   CronTrigger cronTrigger = (CronTrigger) trigger;  
  338.                   String cronExpression = cronTrigger.getCronExpression();  
  339.                   job.setCronExpression(cronExpression);  
  340.               }else if(trigger instanceof SimpleTrigger){  
  341.                   SimpleTrigger simpleTrigger = (SimpleTrigger) trigger;  
  342.                   long milliseconds = simpleTrigger.getRepeatInterval();  
  343.                   job.setTimeValue((int) (milliseconds/1000));  
  344.               }  
  345.               jobList.add(job);  
  346.             }  
  347.         } catch (Exception e) {  
  348.             e.printStackTrace();  
  349.         }  
  350.         return jobList;  
  351.     }  
  352.   
  353.       
  354.       
  355. }  

 

SchedulerManageDao接口:

Java代码  收藏代码
  1. import java.util.List;  
  2.   
  3. import cn.imovie.entity.task.ScheduleJob;  
  4.   
  5. public interface SchedulerManageDao {  
  6.     /** 
  7.      * 新增任务 
  8.      * @param scheduleJob 
  9.      * @throws Exception  
  10.      */  
  11.     public void addJobCron(ScheduleJob scheduleJob) throws Exception;  
  12.       
  13.     /** 
  14.      * 暂停任务 
  15.      * @param scheduleJob 
  16.      */  
  17.     public void pauseJob(ScheduleJob scheduleJob) throws Exception;  
  18.       
  19.     /** 
  20.      * 暂停全部任务 
  21.      */  
  22.     public void pauseAll() throws Exception;  
  23.       
  24.     /** 
  25.      * 恢复任务 
  26.      * @param scheduleJob 
  27.      */  
  28.     public void resumeJob(ScheduleJob scheduleJob) throws Exception;  
  29.       
  30.       
  31.     /** 
  32.      * 恢复所有任务 
  33.      */  
  34.     public void resumeAll() throws Exception;  
  35.       
  36.     /** 
  37.      * 删除任务后,所对应的trigger也将被删除 
  38.      * @param scheduleJob 
  39.      */  
  40.     public void deleteJob(ScheduleJob scheduleJob) throws Exception;  
  41.       
  42.     /** 
  43.      * 立即运行任务 
  44.      * @param scheduleJob 
  45.      */  
  46.     public void triggerJob(ScheduleJob scheduleJob) throws Exception;  
  47.       
  48.     /** 
  49.      * 更新任务的时间表达式 
  50.      * @param scheduleJob 
  51.      */  
  52.     public void updateJobCron(ScheduleJob scheduleJob) throws Exception;  
  53.       
  54.       
  55.     /** 
  56.      * 获取quartz调度器的计划任务 
  57.      * @return 
  58.      */  
  59.     public List<ScheduleJob> getScheduleJobList();  
  60.       
  61.     /** 
  62.      * 获取quartz调度器的运行任务 
  63.      * @return 
  64.      */  
  65.     public List<ScheduleJob> getScheduleJobRunningList();  
  66.   
  67.     public void addJobSimple(ScheduleJob scheduleJob) throws Exception;  
  68.   
  69.     public void updateJobSimple(ScheduleJob scheduleJob) throws Exception;  
  70.   
  71.     /** 
  72.      * 如果scheduleJob.getCronExpression()表达式不为空,使用表达式方式,如果为空,则使用简单方式 
  73.      * @param scheduleJob 
  74.      */  
  75.     public void add(ScheduleJob scheduleJob) throws Exception;  
  76.   
  77.     /** 
  78.      * 如果scheduleJob.getCronExpression()表达式不为空,使用表达式方式,如果为空,则使用简单方式 
  79.      * @param scheduleJob 
  80.      */  
  81.     public void update(ScheduleJob scheduleJob) throws Exception;  
  82.   
  83. }  

 

 

七、自定义一张表,用来保存设置定时任务的时间等信息,方便取出来显示

因为Quartz定时任务设置的时间都是转为毫秒后保存的,所以当你需要将设置当时的具体时间取出来显示是还原不了的,所以创建一张自定义表保存定时任务的信息。

 

表主要是分为表达式和简单的时间配置2种,定时任务优化判断cron_expression是否为空,如果不为空,优先使用表达式来生成动态定时任务,如果为空,则通过获取time_value、time_type来设置定时任务。

 

表结构(Mysql)如下:

Sql代码  收藏代码
  1. CREATE TABLE schedule_job(  
  2. schedule_job_id BIGINT PRIMARY KEY COMMENT 'ID主键' ,  
  3. job_name VARCHAR(200) NOT NULL COMMENT '任务名称',  
  4. job_group VARCHAR(200) NOT NULL COMMENT '任务分组',  
  5. clazz VARCHAR(500) NOT NULL COMMENT '定时任务对应的类(包括包路径)',  
  6. job_status VARCHAR(2) NOT NULL COMMENT '任务状态 1禁用 2启用',  
  7. cron_expression VARCHAR(200)  COMMENT '任务运行时间表达式',  
  8. time_value INT COMMENT '简单时间格式的值',  
  9. time_type VARCHAR(50) COMMENT '简单时间格式的类型:天、时、分、秒',  
  10. job_desc VARCHAR(500) COMMENT '任务描述',  
  11.   
  12. create_man BIGINT NOT NULL,  
  13. create_time DATETIME NOT NULL,  
  14. update_man BIGINT,  
  15. update_time DATETIME  
  16. );  

 

对应的类(ScheduleJob)如下:

Java代码  收藏代码
  1. import java.io.Serializable;  
  2. import java.util.Date;  
  3.   
  4. import com.dexcoder.dal.annotation.Table;  
  5. import com.dexcoder.dal.annotation.Transient;  
  6.   
  7. @SuppressWarnings("serial")  
  8. @Table(name = "schedule_job", pkField = "scheduleJobId", pkColumn = "schedule_job_id")  
  9. public class ScheduleJob implements Serializable{  
  10.       
  11.     private Long scheduleJobId;  
  12.       
  13.     /** 任务名称 */  
  14.     private String jobName;  
  15.       
  16.     /** 任务分组 */  
  17.     private String jobGroup;  
  18.       
  19.     /** 定时任务对应的类(包括包路径),如:cn.imovie.manage.task.job.TicketMoneyLessThanNormalWarn */  
  20.     private String clazz;  
  21.       
  22.     /** 任务状态:1禁用 2启用*/  
  23.     private String jobStatus;  
  24.       
  25.     /** 任务运行时间表达式 */  
  26.     private String cronExpression;  
  27.       
  28.     /** 简单的时间值 */  
  29.     private Integer timeValue;  
  30.     /** 时间类型:秒、分、小时、天 */  
  31.     private String timeType;  
  32.       
  33.     /** 任务描述 */  
  34.     private String jobDesc;  
  35.       
  36.     private Long createMan;  
  37.     private Date createTime;  
  38.     private Long updateMan;  
  39.     private Date updateTime;  
  40.       
  41.     // 非持久化属性  
  42.     private String createManText;  
  43.     private String updateManText;  
  44.   
  45.       
  46.     public Long getScheduleJobId() {  
  47.         return scheduleJobId;  
  48.     }  
  49.   
  50.     public void setScheduleJobId(Long scheduleJobId) {  
  51.         this.scheduleJobId = scheduleJobId;  
  52.     }  
  53.   
  54.     public String getJobName() {  
  55.         return jobName;  
  56.     }  
  57.   
  58.     public void setJobName(String jobName) {  
  59.         this.jobName = jobName;  
  60.     }  
  61.   
  62.     public String getJobGroup() {  
  63.         return jobGroup;  
  64.     }  
  65.   
  66.     public void setJobGroup(String jobGroup) {  
  67.         this.jobGroup = jobGroup;  
  68.     }  
  69.   
  70.     public String getClazz() {  
  71.         return clazz;  
  72.     }  
  73.   
  74.     public void setClazz(String clazz) {  
  75.         this.clazz = clazz;  
  76.     }  
  77.   
  78.     public String getJobStatus() {  
  79.         return jobStatus;  
  80.     }  
  81.   
  82.     public void setJobStatus(String jobStatus) {  
  83.         this.jobStatus = jobStatus;  
  84.     }  
  85.   
  86.     public String getCronExpression() {  
  87.         return cronExpression;  
  88.     }  
  89.   
  90.     public void setCronExpression(String cronExpression) {  
  91.         this.cronExpression = cronExpression;  
  92.     }  
  93.   
  94.     public Integer getTimeValue() {  
  95.         return timeValue;  
  96.     }  
  97.   
  98.     public void setTimeValue(Integer timeValue) {  
  99.         this.timeValue = timeValue;  
  100.     }  
  101.   
  102.     public String getTimeType() {  
  103.         return timeType;  
  104.     }  
  105.   
  106.     public void setTimeType(String timeType) {  
  107.         this.timeType = timeType;  
  108.     }  
  109.   
  110.     public String getJobDesc() {  
  111.         return jobDesc;  
  112.     }  
  113.   
  114.     public void setJobDesc(String jobDesc) {  
  115.         this.jobDesc = jobDesc;  
  116.     }  
  117.   
  118.     public Long getCreateMan() {  
  119.         return createMan;  
  120.     }  
  121.   
  122.     public void setCreateMan(Long createMan) {  
  123.         this.createMan = createMan;  
  124.     }  
  125.   
  126.     public Date getCreateTime() {  
  127.         return createTime;  
  128.     }  
  129.   
  130.     public void setCreateTime(Date createTime) {  
  131.         this.createTime = createTime;  
  132.     }  
  133.   
  134.     public Long getUpdateMan() {  
  135.         return updateMan;  
  136.     }  
  137.   
  138.     public void setUpdateMan(Long updateMan) {  
  139.         this.updateMan = updateMan;  
  140.     }  
  141.   
  142.     public Date getUpdateTime() {  
  143.         return updateTime;  
  144.     }  
  145.   
  146.     public void setUpdateTime(Date updateTime) {  
  147.         this.updateTime = updateTime;  
  148.     }  
  149.   
  150.     @Transient  
  151.     public String getCreateManText() {  
  152.         return createManText;  
  153.     }  
  154.   
  155.     public void setCreateManText(String createManText) {  
  156.         this.createManText = createManText;  
  157.     }  
  158.   
  159.     @Transient  
  160.     public String getUpdateManText() {  
  161.         return updateManText;  
  162.     }  
  163.   
  164.     public void setUpdateManText(String updateManText) {  
  165.         this.updateManText = updateManText;  
  166.     }  
  167.   
  168.       
  169.       
  170. }  

 

 八、一个定时任务Job的例子(仅供参考):这里直接使用了service的注入,默认是不可以的,需要配置customJobFactory ,上面已经有说明。

Java代码  收藏代码
  1. import java.util.Date;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import org.quartz.DisallowConcurrentExecution;  
  7. import org.quartz.Job;  
  8. import org.quartz.JobExecutionContext;  
  9. import org.quartz.JobExecutionException;  
  10. import org.quartz.PersistJobDataAfterExecution;  
  11. import org.slf4j.Logger;  
  12. import org.slf4j.LoggerFactory;  
  13. import org.springframework.beans.factory.annotation.Autowired;  
  14. import org.springframework.stereotype.Component;  
  15.   
  16. import cn.imovie.common.utils.CC;  
  17. import cn.imovie.common.utils.StrUtils;  
  18. import cn.imovie.entity.TsCinemaBasePriceLimit;  
  19. import cn.imovie.entity.warn.Warning;  
  20. import cn.imovie.manage.enums.WarnType;  
  21. import cn.imovie.service.TsCinemaBasePriceLimitService;  
  22. import cn.imovie.service.WarningService;  
  23.   
  24. @Component  
  25. @PersistJobDataAfterExecution  
  26. @DisallowConcurrentExecution  
  27. public class CinemaSalePriceGreaterThanOtherPlatformJob implements Job{  
  28.       
  29.     private Logger log = LoggerFactory.getLogger(CinemaSalePriceGreaterThanOtherPlatformJob.class);  
  30.       
  31.     @Autowired  
  32.     private TsCinemaBasePriceLimitService tsCinemaBasePriceLimitService;  
  33.     @Autowired  
  34.     private WarningService warningService;  
  35.   
  36.     @Override  
  37.     public void execute(JobExecutionContext context)  
  38.             throws JobExecutionException {  
  39.         Date currentTime = new Date();  
  40.           
  41.         Map<String, List<TsCinemaBasePriceLimit>> map = new HashMap<String, List<TsCinemaBasePriceLimit>>();  
  42.         try {  
  43.             map = tsCinemaBasePriceLimitService.listCinemaSalePriceGreaterThanOtherPlatform("1,3", currentTime);  
  44.         } catch (Exception e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.         if(!StrUtils.isEmptyMap(map)){  
  48.             List<TsCinemaBasePriceLimit> list_2d = map.get("2d");  
  49.             String reason = "2D或3D销售价格高于其它平台的价格设置";  
  50.             for (TsCinemaBasePriceLimit tsCinemaBasePriceLimit : list_2d) {  
  51.                 Warning warning = new Warning();  
  52.                 warning.setWarnType(WarnType.CINEMA_SALE_PRICE_GREATER_THAN_OTHER_PLATFORM.getValue());  
  53.                 warning.setAssociatedTable("ts_cinema_base_price_limit");  
  54.                 warning.setAssociatedTableId(tsCinemaBasePriceLimit.getPriceLimitId());  
  55.                 warning.setReason(reason);  
  56.                 warning.setCreateTime(currentTime);  
  57.                 warning.setCreateMan(-999L);  
  58.                 warningService.save(warning);  
  59.             }  
  60.               
  61.             List<TsCinemaBasePriceLimit> list_3d = map.get("3d");  
  62.             for (TsCinemaBasePriceLimit tsCinemaBasePriceLimit_3d : list_3d) {  
  63.                 Warning warning = new Warning();  
  64.                 warning.setWarnType(WarnType.CINEMA_SALE_PRICE_GREATER_THAN_OTHER_PLATFORM.getValue());  
  65.                 warning.setAssociatedTable("ts_cinema_base_price_limit");  
  66.                 warning.setAssociatedTableId(tsCinemaBasePriceLimit_3d.getPriceLimitId());  
  67.                 warning.setReason(reason);  
  68.                 warning.setCreateTime(currentTime);  
  69.                 warning.setCreateMan(-999L);  
  70.                 warningService.save(warning);  
  71.             }  
  72.         }  
  73.         log.info(CC.LOG_PREFIX + "[CinemaSalePriceGreaterThanOtherPlatformJob]定时任务执行完毕。");  
  74.     }  
  75.   
  76. }  

 

 

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!) 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年9月6日

http://www.cnblogs.com/fanshuyao/

posted @ 2017-09-06 15:02  蕃薯耀  阅读(5281)  评论(1编辑  收藏  举报