zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    内存溢出
    接手新业务
    pjb fabu
    中文手册
    人背的时候,做啥都失败
    帮助开发人员学习
    python中的__dict__,__getattr__,__setattr__
    NetCore在Docker中发布及运行
    ELK基础配置
    IdentityServer4 手动验签及日志记录
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/7484843.html
Copyright © 2011-2022 走看看