现在的位置: 首页 > 综合 > 正文

Quartz java实例解析,web应用

2017年12月11日 ⁄ 综合 ⁄ 共 55420字 ⁄ 字号 评论关闭

Quartz java实例解析,web应用

 

最近公司要做个接口定时任务,本来考虑使用java API中的Timer + TimerTask,其实这个类还是蛮强大的,对于执行时间和执行间隔,调控起来也比较容易。

Java代码
  1. timer.schedule(new MyTask(),calendar.getTime(), 24*60*60*1000)  

也就准备用着个了,写个listener监听器,启动服务器一直报null错误。因为服务器启动的时候会去执行监听器,而监听器会执行到这个schedule方法,也就是

说会去执行new MyTask(),此时不知道是Spring未加载的原因还是什么?MyTask()中声明的service方法一直为空,弄了好长时间也没解决,放弃。

 

第二方案准备使用spring自带的监听器

Xml代码
  1. <bean id="interfaceInvokeAutoTestTask" 
      
  2.         class="*.InterfaceInvokeAutoTestTask"  
  3.         >  
  4.     </bean>  
  5.     <bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">  
  6.         <property name="timerTask"> 
      
  7.             <ref bean="interfaceInvokeAutoTestTask"/> 
      
  8.         </property>  
  9.         <!-- 任务执行周期  关于一些任务的参数请参考JDK doc文档和Spring相关文档-->    
  10.         <property name="period"> 
      
  11.             <value>10000000</value> 
      
  12.         </property>    
  13.         <!-- 延时10s 执行任务 -->    
  14.         <property name="delay"> 
      
  15.             <value>5000000</value> 
      
  16.         </property>    
  17.     </bean>  
  18.        
  19.     <!-- 启动定时器 -->  
  20.     <bean id="timerBean"  
  21.         class="org.springframework.scheduling.timer.TimerFactoryBean">  
  22.         <property name="scheduledTimerTasks">  
  23.             <list>  
  24.                 <ref bean="scheduledTask" />  
  25.             </list>  
  26.         </property>  
  27.     </bean>  

 问题1:执行时间控制起来会麻烦点;

 问题2:多次执行后执行时间会有延迟,这方面参考其他文档,

Xml代码
  1. ScheduledTimerTask //执行任务单线程  

 问题3:spring本身已经抛弃

 

于是考虑使用quarts,下载,导jar就不说了。

直接开始说例子1吧

 

Java代码
  1. public class HelloJob implements Job {
      
  2.   
  3.     private static Logger _log = LoggerFactory.getLogger(HelloJob.class);
      
  4.   
  5.     /**
     
  6.      * <p>  
  7.      * Empty constructor for job initilization
     
  8.      * </p>  
  9.      * <p>  
  10.      * Quartz requires a public empty constructor so that the
     
  11.      * scheduler can instantiate the class whenever it needs.
     
  12.      * </p>  
  13.      */  
  14.     public HelloJob() {   
  15.     }   
  16.   
  17.     /**
     
  18.      * <p>  
  19.      * Called by the <code>{@link org.quartz.Scheduler}</code> when a
     
  20.      * <code>{@link org.quartz.Trigger}</code> fires that is associated with
     
  21.      * the <code>Job</code>.
     
  22.      * </p>  
  23.      *   
  24.      * @throws JobExecutionException
     
  25.      *             if there is an exception while executing the job.
     
  26.      */  
  27.     public void execute(JobExecutionContext context)   
  28.         throws JobExecutionException {   
  29.   
  30.         // Say Hello to the World and display the date/time
      
  31.         _log.info("Hello World! - " + new Date());   
  32.     }   
  33.   
  34. }  

 

 

Java代码
  1. public class SimpleExample {   
  2.   
  3.        
  4.     public void run() throws Exception {
      
  5.         Logger log = LoggerFactory.getLogger(SimpleExample.class);   
  6.   
  7.         log.info("------- Initializing ----------------------");   
  8.   
  9.         // First we must get a reference to a scheduler
      
  10.         SchedulerFactory sf = new StdSchedulerFactory();   
  11.         Scheduler sched = sf.getScheduler();     // 创建一任务
      
  12.   
  13.         log.info("------- Initialization Complete -----------");   
  14.   
  15.         // computer a time that is on the next round minute
      
  16.         Date runTime = evenMinuteDate(new Date()); //java api Calendar 方法延迟一分钟
      
  17.   
  18.         log.info("------- Scheduling Job  -------------------");   
  19.   
  20.         // define the job and tie it to our HelloJob class
      
  21.         JobDetail job = newJob(HelloJob.class)   
  22.             .withIdentity("job1""group1")    //withIdentity(String name, String group)  ,将job关联到组中
      
  23.             .build();   
  24.            
  25.         // Trigger the job to run on the next round minute
      
  26.         Trigger trigger = newTrigger()   
  27.             .withIdentity("trigger1""group1")   
  28.             .startAt(runTime)   
  29.             .build();   
  30.            /*   生成job
     
  31.                    public JobDetail build()
     
  32.     {  
  33.         JobDetailImpl job = new JobDetailImpl();
     
  34.         job.setJobClass(jobClass);
     
  35.         job.setDescription(description);
     
  36.         if(key == null)
     
  37.             key = new JobKey(Key.createUniqueName(null), null);
     
  38.         job.setKey(key);
     
  39.         job.setDurability(durability);
     
  40.         job.setRequestsRecovery(shouldRecover);
     
  41.         if(!jobDataMap.isEmpty())
     
  42.             job.setJobDataMap(jobDataMap);
     
  43.         return job;
     
  44.     }  
  45.  
  46. */  
  47.   
  48.   
  49.   
  50.  // Tell quartz to schedule the job using our trigger
      
  51.         sched.scheduleJob(job, trigger);    //触发器执行任务组
      
  52.         log.info(job.getKey() + " will run at: " + runTime);     
  53.   
  54.         // Start up the scheduler (nothing can actually run until the 
      
  55.         // scheduler has been started)
      
  56.         sched.start();   
  57.   
  58.         log.info("------- Started Scheduler -----------------");   
  59.   
  60.         // wait long enough so that the scheduler as an opportunity to 
      
  61.         // run the job!
      
  62.         log.info("------- Waiting 65 seconds... -------------");   
  63.         try {   
  64.             // wait 65 seconds to show job
      
  65.             Thread.sleep(65L * 1000L);    
  66.             // executing...
      
  67.         } catch (Exception e) {   
  68.         }   
  69.   
  70.         // shut down the scheduler
      
  71.         log.info("------- Shutting Down ---------------------");   
  72.         sched.shutdown(true);   
  73.         log.info("------- Shutdown Complete -----------------");   
  74.     }   
  75.   
  76.     public static void main(String[] args) throws Exception {
      
  77.   
  78.         SimpleExample example = new SimpleExample();   
  79.         example.run();   
  80.   
  81.     }   
  82.   
  83. }  

 

关于简单的定时任务上面的例一已经说明

 

下面看例2,从任务开始时间,执行次数,执行间隔来控制任务

Java代码
  1. JobDetail job = newJob(SimpleJob.class)   
  2.             .withIdentity("job1""group1")   
  3.             .build();   
  4.            
  5.         SimpleTrigger trigger = (SimpleTrigger) newTrigger()    
  6.             .withIdentity("trigger1""group1")   
  7.             .startAt(startTime)   
  8.             .build();     //默认执行一次,也就无间隔
      
  9.   
  10. Date ft = sched.scheduleJob(job, trigger);   
  11.         log.info(job.getKey() +   
  12.                 " will run at: " + ft +     
  13.                 " and repeat: " + trigger.getRepeatCount() +    
  14.                 " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");
      
  15. //group1.job1 will run at: Mon Dec 17 10:05:30 CST 2012 and repeat: 0 times, every 0 seconds  

 

 

Java代码
  1.  // job3 will run 11 times (run once and repeat 10 more times)
      
  2.         // job3 will repeat every 10 seconds
      
  3.         job = newJob(SimpleJob.class)   
  4.             .withIdentity("job3""group1")   
  5.             .build();   
  6.   
  7.         trigger = newTrigger()   
  8.             .withIdentity("trigger3""group1")   
  9.             .startAt(startTime)   
  10.             .withSchedule(simpleSchedule()   
  11.                     .withIntervalInSeconds(10)   
  12.                     .withRepeatCount(10))   
  13.             .build();   
  14.   
  15. //group1.job3 will run at: Mon Dec 17 10:05:30 CST 2012 and repeat: 10 times, every 10 seconds  

 

 

Java代码
  1. // the same job (job3) will be scheduled by a another trigger
      
  2.         // this time will only repeat twice at a 70 second interval
      
  3. trigger = newTrigger()   
  4.             .withIdentity("trigger3""group2")   
  5.             .startAt(startTime)   
  6.             .withSchedule(simpleSchedule()   
  7.                     .withIntervalInSeconds(10)   
  8.                     .withRepeatCount(2))   
  9.             .forJob(job)   
  10.             .build();   
  11.   
  12.  //group1.job3 will [also] run at: Mon Dec 17 10:24:30 CST 2012 and repeat: 2 times, every 10 seconds  

 

Java代码
  1. // job4 will run 6 times (run once and repeat 5 more times)
      
  2.         // job4 will repeat every 10 seconds
      
  3.         job = newJob(SimpleJob.class)   
  4.             .withIdentity("job4""group1")   
  5.             .build();   
  6.   
  7.         trigger = newTrigger()   
  8.             .withIdentity("trigger4""group1")   
  9.             .startAt(startTime)   
  10.             .withSchedule(simpleSchedule()   
  11.                     .withIntervalInSeconds(10)   
  12.                     .withRepeatCount(5))   
  13.             .build();   
  14. //group1.job4 will run at: Mon Dec 17 10:24:30 CST 2012 and repeat: 5 times, every 10 seconds  

 

Java代码
  1. // job5 will run once, five minutes in the future
      
  2.         job = newJob(SimpleJob.class)   
  3.             .withIdentity("job5""group1")   
  4.             .build();   
  5.   
  6.         trigger = (SimpleTrigger) newTrigger()    
  7.             .withIdentity("trigger5""group1")   
  8.             .startAt(futureDate(5, IntervalUnit.MINUTE))   
  9.             .build();   
  10. //group1.job5 will run at: Mon Dec 17 10:29:18 CST 2012 and repeat: 0 times, every 0 seconds  

 

Java代码
  1. // job6 will run indefinitely, every 40 seconds
      
  2.         job = newJob(SimpleJob.class)   
  3.             .withIdentity("job6""group1")   
  4.             .build();   
  5.   
  6.         trigger = newTrigger()   
  7.             .withIdentity("trigger6""group1")   
  8.             .startAt(startTime)   
  9.             .withSchedule(simpleSchedule()   
  10.                     .withIntervalInSeconds(40)   
  11.                     .repeatForever())   
  12.             .build();   
  13. //group1.job6 will run at: Mon Dec 17 10:24:30 CST 2012 and repeat: -1 times, every 40 seconds  

 

Java代码
  1. // jobs can also be scheduled after start() has been called...
      
  2.         // job7 will repeat 20 times, repeat every five minutes
      
  3.         job = newJob(SimpleJob.class)   
  4.             .withIdentity("job7""group1")   
  5.             .build();   
  6.            
  7.         trigger = newTrigger()   
  8.             .withIdentity("trigger7""group1")   
  9.             .startAt(startTime)   
  10.             .withSchedule(simpleSchedule()   
  11.                     .withIntervalInMinutes(5)  //5* 60000
      
  12.                     .withRepeatCount(20))   
  13.             .build();   
  14. //group1.job7 will run at: Mon Dec 17 10:24:30 CST 2012 and repeat: 20 times, every 300 seconds  

 

Java代码
  1. // jobs can be fired directly... (rather than waiting for a trigger)
      
  2.         job = newJob(SimpleJob.class)   
  3.             .withIdentity("job8""group1")   
  4.             .storeDurably()   
  5.             .build();   
  6.        
  7.         sched.addJob(job, true);   
  8.            
  9.         log.info("'Manually' triggering job8...");   
  10.         sched.triggerJob(jobKey("job8""group1"));   
  11. //手动触发一个任务  

 

重新触发

Java代码
  1. // jobs can be re-scheduled...  
      
  2.         // job 7 will run immediately and repeat 10 times for every second
      
  3.         log.info("------- Rescheduling... --------------------");   
  4.         trigger = newTrigger()   
  5.             .withIdentity("trigger7""group1")   
  6.             .startAt(startTime)   
  7.             .withSchedule(simpleSchedule()   
  8.                     .withIntervalInMinutes(5)   
  9.                     .withRepeatCount(20))   
  10.             .build();  

 

显示执行信息

Java代码
  1. // display some stats about the schedule that just ran
      
  2.         SchedulerMetaData metaData = sched.getMetaData();   
  3.         log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");   
  4. //Executed 35 jobs.  

 

接下来看例子3,执行条件表达式

Java代码 复制代码 收藏代码
  1. // job 1 will run every 20 seconds
      
  2.         JobDetail job = newJob(SimpleJob.class)   
  3.             .withIdentity("job1""group1")   
  4.             .build();   
  5.            
  6.         CronTrigger trigger = newTrigger()   
  7.             .withIdentity("trigger1""group1")   
  8.             .withSchedule(cronSchedule("0/20 * * * * ?"))   // 20秒执行一次   0,20,40,0---
      
  9.             .build();   
  10. Date ft = sched.scheduleJob(job, trigger);   
  11.         log.info(job.getKey() + " has been scheduled to run at: " + ft   
  12.                 + " and repeat based on expression: "  
  13.                 + trigger.getCronExpression());   
  14.   
  15.   
  16. //group1.job1 has been scheduled to run at: Mon Dec 17 13:11:40 CST 2012 and repeat based on expression: 0/20 * * * * ?  

 

Java代码
  1. // job 2 will run every other minute (at 15 seconds past the minute)
      
  2.        job = newJob(SimpleJob.class)   
  3.            .withIdentity("job2""group1")   
  4.            .build();   
  5.           
  6.        trigger = newTrigger()   
  7.            .withIdentity("trigger2""group1")   
  8.            .withSchedule(cronSchedule("15 0/2 * * * ?")) //没隔一分钟,15秒时执行一次
      
  9.            .build();  

 

下面不贴代码了,将例子中所写的表达式做个说明

Java代码
  1. // job 3 will run every other minute but only between 8am and 5pm
      
  2. "0 0/2 8-17 * * ?"  
  3.   
  4.  // job 4 will run every three minutes but only between 5pm and 11pm
      
  5. 0 0/3 17-23 * * ?
      
  6.   
  7. // job 5 will run at 10am on the 1st and 15th days of the month
      
  8. 0 0 10am 1,15 * ?
      
  9.   
  10. // job 6 will run every 30 seconds but only on Weekdays (Monday through Friday)
      
  11. 0,30 * * ? * MON-FRI   
  12.   
  13. // job 7 will run every 30 seconds but only on Weekends (Saturday and Sunday)
      
  14. 0,30 * * ? * SAT,SUN  
  1. /*     引用别人的
  2. --------------------------------------
     
  3.     0 0 12 * * ?            每天12点触发
     
  4.     0 15 10 ? * *           每天10点15分触发
     
  5.     0 15 10 * * ?           每天10点15分触发
     
  6.     0 15 10 * * ? *         每天10点15分触发
     
  7.     0 15 10 * * ? 2005      2005年每天10点15分触发
     
  8.     0 * 14 * * ?            每天下午的 2点到2点59分每分触发
     
  9.     0 0/5 14 * * ?          每天下午的 2点到2点59分(整点开始,每隔5分触发)
     
  10.     0 0/5 14,18 * * ?       每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发)
     
  11.     0 0-5 14 * * ?          每天下午的 2点到2点05分每分触发
     
  12.     0 10,44 14 ? 3 WED      3月分每周三下午的 2点10分和2点44分触发
     
  13.     0 15 10 ? * MON-FRI     从周一到周五每天上午的10点15分触发
     
  14.     0 15 10 15 * ?          每月15号上午10点15分触发
     
  15.     0 15 10 L * ?           每月最后一天的10点15分触发
     
  16.     0 15 10 ? * 6L          每月最后一周的星期五的10点15分触发
     
  17.     0 15 10 ? * 6L 2002-2005    从2002年到2005年每月最后一周的星期五的10点15分触发
     
  18.     0 15 10 ? * 6#3         每月的第三周的星期五开始触发
     
  19.     0 0 12 1/5 * ?          每月的第一个中午开始每隔5天触发一次
     
  20.     0 11 11 11 11 ?         每年的11月11号 11点11分触发(光棍节)
     
  21. --------------------------------------
     
  22.  */
     
Quartz Cron 表达式支持到七个域
名称 是否必须 允许值 特殊字符
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT , - * ? / L #
空 或 1970-2099 , - * /

 

 

可以看到基本结构是   秒_分_小时_日_月_[周]_[年] 后面的周和年是可选的 

其次,通配符,主要的有星号(*);问号(?);减号(-);逗号(,);斜杠(/);L字母;W字母;井号(#). 

  • 星号:表示任意时刻
  • 问号:只能在日或周字段上使用,http://blog.csdn.net/chh_jiang/article/details/4603529
      这里有比较清晰的解释,简单的理解就是日期和星期是有冲突的,指定其中一个的话,另外一个是没办法指定的,比如每个月12号和每个星期二,这两个是"互斥"的,不能用日期和周来指定所有“每个是星期二的12号”这个时间。
  • 减号:范围,如 1-5秒
  • 逗号:列表,如 1,5,10 秒
  • 斜杠:等步长序列,如3/13秒 表示 3,16,29,42,55,3,16...
  • L:仅在日和周上支持,表示允许的最后一个值,注意不要让范围和列表与L连用
  • W:工作日
  • 井号:为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。(引用)

例4主要讲解下job中的JobDataMap

Java代码  
  1. // pass initialization parameters into the job
      
  2.         job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");   
  3.         job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);   
  4.   
  5.   
  6. public void execute(JobExecutionContext context)   
  7.         throws JobExecutionException {   
  8.   
  9.         // This job simply prints out its job name and the
      
  10.         // date and time that it is running
      
  11.         JobKey jobKey = context.getJobDetail().getKey();   
  12.            
  13.         // Grab and print passed parameters
      
  14.         JobDataMap data = context.getJobDetail().getJobDataMap();   
  15.         String favoriteColor = data.getString(FAVORITE_COLOR);   
  16.         int count = data.getInt(EXECUTION_COUNT);   
  17. }  

 

后面的例子看了看,就不介绍了。前面这些基本就够了 

 

工作中的过程

1。页面部分,主要是一些任务的定制

 

 

 

 

 

 

页面代码

 

任务代码

 

Java代码  
  1. /**  
  2.      * 开启定时任务
     
  3.      * @param id
     
  4.      */  
  5.     private void startTaskById(String id){   
  6.         //获得定时任务信息
      
  7.         SysInterfaceTimerTask newTask = sysInterfaceTimerTaskService.selectByTemplateID(id);   
  8.         String taskId = newTask.getId();          //主键
      
  9.         Date startTime = newTask.getStartTime();   
  10.         Date stopTime = newTask.getStopTime();   
  11.         String conditionK = newTask.getConditionK();   
  12.         String conditionV = newTask.getConditionV();   
  13.         String tempId = newTask.getFId();          //模板ID
      
  14.            
  15.         try {   
  16.             // 获得一个计划任务
      
  17.             Scheduler sched = sf.getScheduler();   
  18.             MyJobListener myJobListener = new MyJobListener();   
  19.             sched.getListenerManager().addJobListener(myJobListener);   
  20.                
  21.             if(conditionK.equals("1")){   
  22.                        
  23.                     JobDetail job = JobBuilder.newJob(InterfaceInvokeAutoTestTask.class)   
  24.                                     .withIdentity(tempId, tempId)   
  25.                                     .build();                //定义一个job
      
  26.                        
  27.                     // 将初始化参数设置近 Job 中
      
  28.                     job.getJobDataMap().put(InterfaceInvokeAutoTestTask.TEMPLATEID, tempId);    //将当前的ID赋值给Job
      
  29.                        
  30.                     SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()   
  31.                                     .withIdentity(tempId,tempId)   
  32.                                     .startAt(startTime)   
  33.                                     .build();                 //定义触发器
      
  34.                        
  35.                     sched.scheduleJob(job, simpleTrigger);    //绑定任务
      
  36.                        
  37.             }else if(conditionK.equals("2")){
      
  38.                    
  39.                 String hour = conditionV.substring(0, conditionV.indexOf(":"));   
  40.                    
  41.                 if(stopTime == null){  //每间隔  1s  执行 1次
      
  42.                     String minute = conditionV.substring(conditionV.indexOf(":") + 1, conditionV.indexOf(";"));
      
  43.                     String times = conditionV.substring(conditionV.indexOf(";") + 1);   
  44.                        
  45.                     JobDetail job = JobBuilder.newJob(InterfaceInvokeAutoTestTask.class)   
  46.                     .withIdentity(tempId, tempId)   
  47.                     .usingJobData(InterfaceInvokeAutoTestTask.TEMPLATEID, tempId)   
  48.                     .build();   
  49.                        
  50.                     SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()   
  51.                     .withIdentity(tempId, tempId)   
  52.                     .startAt(startTime)   
  53.                     .withSchedule(SimpleScheduleBuilder.simpleSchedule()   
  54.                                     .withIntervalInHours(Integer.valueOf(hour))   
  55.                                     .withIntervalInMinutes(Integer.valueOf(minute))   
  56.                                     .withRepeatCount(Integer.valueOf(times) - 1)   //重复次数 = 执行次数 - 1
      
  57.                         ).build();   
  58.                        
  59.                     sched.scheduleJob(job, simpleTrigger);   
  60.                        
  61.                 }else{               //在一定时间范围内,每隔指定时间执行一次
      
  62.                     String minute = conditionV.substring(conditionV.indexOf(":") + 1);   
  63.                        
  64.                     JobDetail job = JobBuilder.newJob(InterfaceInvokeAutoTestTask.class)   
  65.                     .withIdentity(tempId, tempId)   
  66.                     .usingJobData(InterfaceInvokeAutoTestTask.TEMPLATEID, tempId)   
  67.                     .build();   
  68.                        
  69.                     SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()   
  70.                     .withIdentity(tempId, tempId)   
  71.                     .startAt(startTime)   
  72.                     .withSchedule(SimpleScheduleBuilder.simpleSchedule()   
  73.                                     .withIntervalInHours(Integer.valueOf(hour))   
  74.                                     .withIntervalInMinutes(Integer.valueOf(minute))   
  75.                                     .repeatForever()   
  76.                         )   
  77.                     .endAt(stopTime)   
  78.                     .build();   
  79.                        
  80.                     sched.scheduleJob(job, simpleTrigger);   
  81.                        
  82.                 }   
  83.                    
  84.             }else if(conditionK.equals("3")){
      
  85.                    
  86.                 JobDetail job = JobBuilder.newJob(InterfaceInvokeAutoTestTask.class)   
  87.                 .withIdentity(tempId, tempId)   
  88.                 .usingJobData(InterfaceInvokeAutoTestTask.TEMPLATEID, tempId)   
  89.                 .build();   
  90.                    
  91.                 SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()   
  92.                 .withIdentity(taskId, taskId)   
  93.                 .startAt(startTime)   
  94.                 .withSchedule(SimpleScheduleBuilder.simpleSchedule()   
  95.                                 .withIntervalInHours(24 * Integer.valueOf(conditionV))   
  96.                                 .repeatForever()   
  97.                     )   
  98.                 .endAt(stopTime)   
  99.                 .build();   
  100.                    
  101.                 sched.scheduleJob(job, simpleTrigger);   
  102.                    
  103.             }else if(conditionK.equals("4")){
      
  104.                    
  105.                 StringBuffer sb = new StringBuffer();   
  106.                    
  107.                 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");  //截取时分秒
      
  108.                 String formatDate = simpleDateFormat.format(startTime);          
  109.                 String s = formatDate.substring(formatDate.lastIndexOf(":")+1);   
  110.                 String m = formatDate.substring(formatDate.indexOf(":")+1,formatDate.lastIndexOf(":"));
      
  111.                 String h = formatDate.substring(0, formatDate.indexOf(":"));   
  112.                    
  113.                 sb.append(s).append(" ").append(m).append(" ").append(h).append(" ")
      
  114.                     .append("? * ");   
  115.                    
  116.                 /*周一 Mon
     
  117.                 周二 Tue
     
  118.                 周三 Wed
     
  119.                 周四 Thu
     
  120.                 周五 Fri
     
  121.                 周六 Sat
     
  122.                 周日 Sun*/  
  123.                 String replaceWeek = conditionV.replace("AA""Mon")   
  124.                                           .replace("BB""Tue")   
  125.                                           .replace("CC""Wed")   
  126.                                           .replace("DD""Thu")   
  127.                                           .replace("EE""Fri")   
  128.                                           .replace("FF""Sat")   
  129.                                           .replace("GG""Sun")   
  130.                                           .replace(" """);   
  131.                    
  132.                 replaceWeek = replaceWeek.substring(replaceWeek.indexOf("[")+1, replaceWeek.indexOf("]"));
      
  133.                    
  134.                 sb.append(replaceWeek);   
  135.                    
  136.                 JobDetail job = JobBuilder.newJob(InterfaceInvokeAutoTestTask.class)   
  137.                 .withIdentity(tempId, tempId)   
  138.                 .usingJobData(InterfaceInvokeAutoTestTask.TEMPLATEID, taskId)   
  139.                 .build();   
  140.                    
  141.                 CronTrigger trigger = TriggerBuilder.newTrigger()   
  142.                 .withIdentity(taskId, taskId)   
  143.                 .startAt(startTime)   
  144.                 .withSchedule(CronScheduleBuilder.cronSchedule(sb.toString()))   
  145.                 .endAt(stopTime)   
  146.                 .build();   
  147.                    
  148.                 sched.scheduleJob(job, trigger);   
  149.             }   
  150.                
  151.             sched.start();           //开启定时任务
      
  152.                
  153.             newTask.setIsRun("1");   
  154.             sysInterfaceTimerTaskService.update(newTask);                  //任务启用后,将任务标志inRun设置为1
      
  155.         } catch (SchedulerException e) {   
  156.             e.printStackTrace();   
  157.         }   
  158.     }   
  159.        
  160.     /**
     
  161.      * 停止 单个 任务
     
  162.      * @return
     
  163.      */  
  164.     public String stopTask(){   
  165.         Scheduler sched = null;   
  166.            
  167.         try {   
  168.             sched = sf.getScheduler();   
  169.                
  170.             SysInterfaceTimerTask delTask = sysInterfaceTimerTaskService.selectByTemplateID(sysInterfaceTemplate.getId());   
  171.                
  172.             sched.deleteJob(new JobKey(delTask.getFId(),delTask.getFId()));   //停止任务
      
  173.                
  174.             delTask.setIsRun("0");   
  175.             sysInterfaceTimerTaskService.update(delTask);                  //任务停止后,将任务标志inRun设置为0
      
  176.                
  177.         } catch (SchedulerException e) {   
  178.             e.printStackTrace();   
  179.         }   
  180.            
  181.         return "templist_redo";   
  182.     }  

 

 

执行任务

 

Java代码  
  1. package com.besttone.mobile.mcipm.util.interfaceTask;   
  2.   
  3. import *   
  4.   
  5. /**  
  6.  * 定时任务  
  7.  * @author Administrator
     
  8.  *  
  9.  */  
  10. public class InterfaceInvokeAutoTestTask implements Job{
      
  11.   
  12.     private SysInterfaceTemplateService sysInterfaceTemplateService = (SysInterfaceTemplateService) SpringContextUtil.getBean("sysInterfaceTemplateService");
      
  13.     private SysInterfaceParamsMapper sysInterfaceParamsMapper = (SysInterfaceParamsMapper) SpringContextUtil.getBean("sysInterfaceParamsMapper");
      
  14.     private SysInterfaceTimerInvokeMapper sysInterfaceTimerInvokeMapper = (SysInterfaceTimerInvokeMapper) SpringContextUtil.getBean("sysInterfaceTimerInvokeMapper");
      
  15.        
  16.     private Date date;   //任务开始时间
      
  17.     private long beginTimeInMillis;   //任务开始时间
      
  18.     private long endTimeInMillis;     //任务结束时间
      
  19.        
  20.     //模板ID通过job.getJobDataMap() 设置
      
  21.     public static final String TEMPLATEID = "templateId";
      
  22.        
  23.     /**
     
  24.      * 执行任务  
  25.      */  
  26.     @Override  
  27.     public void execute(JobExecutionContext context) throws JobExecutionException {
      
  28.            
  29.         synchronized (InterfaceInvokeAutoTestTask.class) {
      
  30.             System.out.println("======================================================");   
  31.             date = new Date();   
  32.             beginTimeInMillis = Calendar.getInstance().getTimeInMillis(); //记录任务的开始时间
      
  33.             // Grab and print passed parameters
      
  34.             JobDataMap data = context.getJobDetail().getJobDataMap();   
  35.             String templateId = data.getString(TEMPLATEID);   
  36.             SysInterfaceTemplate selectByPrimaryKey = sysInterfaceTemplateService   
  37.                     .selectByPrimaryKey(templateId);   
  38.             generateURL(selectByPrimaryKey); //返回结果信息
      
  39.         }   
  40.            
  41.     }   
  42.        
  43.     /**
     
  44.      *   
  45.      * @param sysInterfaceTemplate
     
  46.      * @return 请求URL
     
  47.      */  
  48.     private void generateURL(SysInterfaceTemplate sysInterfaceTemplate){
      
  49.         String id = sysInterfaceTemplate.getId();   
  50.         String templatename = sysInterfaceTemplate.getTemplatename();   
  51.         String url = sysInterfaceTemplate.getUrl();   
  52.         int paramnum = sysInterfaceTemplate.getParamnum().intValue();   
  53.         String method = sysInterfaceTemplate.getMethod();   
  54.            
  55.            
  56.         List<SysInterfaceParams> selectByTemplateId = sysInterfaceParamsMapper.selectByTemplateId(id);   
  57.         List<NameValuePair> nameValueLists = new ArrayList<NameValuePair>();   
  58.            
  59.         StringBuffer sb = new StringBuffer();   //请求地址  类似method:*&req={k1:v1}
      
  60.            
  61.         String keyIsInReq = "";   
  62.            
  63.         for(int i=0;i<paramnum;i++){
      
  64.             String keyString = selectByTemplateId.get(i).getParamkey();   
  65.             String valueString = selectByTemplateId.get(i).getParamvalue();   
  66.             String isleaf = selectByTemplateId.get(i).getIsleaf();   
  67.             int sortcount = selectByTemplateId.get(i).getSortcount().intValue();   
  68.                
  69.             if(keyString.equals("method")){   
  70.                 sb.append(keyString).append("=").append(valueString);   
  71.                 nameValueLists.add(new NameValuePair(keyString, valueString));   
  72.             }else if(isleaf.equals("1")){     //如果是非叶子节点,拼接字符串
      
  73.                 if (valueString.indexOf("$") != -1) {   //req的value 一般类似 3$4$5
      
  74.                     String parseJSON = parseJSON(valueString, selectByTemplateId);   
  75.                     sb.append("&").append(keyString).append("=").append(parseJSON);   
  76.                     keyIsInReq = valueString;   
  77.                     nameValueLists.add(new NameValuePair(keyString, parseJSON));   
  78.                 }   
  79.             }else{   
  80.                 if (!keyIsInReq.contains(String.valueOf(sortcount))) {   
  81.                     sb.append("&").append(keyString).append("=").append(valueString);   
  82.                     nameValueLists.add(new NameValuePair(keyString, valueString));   
  83.                 }   
  84.             }   
  85.                
  86.                
  87.             /*if (keyString.equalsIgnoreCase("method")) {
     
  88.                 sb.append(keyString).append("=").append(valueString);
     
  89.                 nameValueLists.add(new NameValuePair(keyString, valueString));   
     
  90.             }else if(keyString.equalsIgnoreCase("req")){
     
  91.                 sb.append("&").append(keyString).append("=");
     
  92.                 String parseJSON = null;
     
  93.                 if (valueString.indexOf("$") != -1) {   //req的value 一般类似 3$4$5
     
  94.                     parseJSON = parseJSON(valueString, selectByTemplateId);
     
  95. //                  int lastIndexOf = parseJSON.lastIndexOf("}");
     
  96. //                  if(parseJSON.substring(lastIndexOf - 2, lastIndexOf - 1).equals(",") ){
     
  97. //                  }
     
  98.                     sb.append(parseJSON);
     
  99.                 }else{
     
  100.                     sb.append(valueString);
     
  101.                 }
     
  102.                 nameValueLists.add(new NameValuePair(keyString, parseJSON));
     
  103.             }else{
     
  104.                 //如果req中包含了当前key,则跳过,否则拼接到字符串中
     
  105.                 if(!valueString.contains(String.valueOf((i+1)))){
     
  106.                     sb.append("&").append(keyString).append("=").append(valueString);
     
  107.                     nameValueLists.add(new NameValuePair(keyString, valueString));   
     
  108.                 }
     
  109.             }*/  
  110.                
  111.         }   
  112.         try {   
  113.             String sendRequest = sendRequest(nameValueLists, method, url, sb.toString());   
  114.                
  115.             SysInterfaceTimerInvoke sysInterfaceTimerInvoke = new SysInterfaceTimerInvoke();   
  116.             sysInterfaceTimerInvoke.setTemplateName(templatename);   
  117.             sysInterfaceTimerInvoke.setUrl(url);   
  118.             sysInterfaceTimerInvoke.setMethod(method);   
  119.             sysInterfaceTimerInvoke.setParamNum(paramnum);   
  120.             sysInterfaceTimerInvoke.setParam(sb.toString());   
  121.             sysInterfaceTimerInvoke.setStartTime(date);   
  122.             if (sendRequest.substring(09).equals("Exception")) {
      
  123.                 sysInterfaceTimerInvoke.setResult("失败");   
  124.             }else{   
  125.                 if(sendRequest.indexOf("\"result\":\"00\"") > -1){
      
  126.                     sysInterfaceTimerInvoke.setResult("成功");   
  127.                 }else {   
  128.                     sysInterfaceTimerInvoke.setResult("失败");   
  129.                 }   
  130.             }   
  131.            
  132.             sysInterfaceTimerInvoke.setMessage(sendRequest);   
  133.                
  134.             endTimeInMillis = Calendar.getInstance().getTimeInMillis();     //记录任务的结束时间
      
  135.             long invokeTime = endTimeInMillis - beginTimeInMillis;   
  136.             sysInterfaceTimerInvoke.setInvokeTime(invokeTime+" ms");   
  137.                
  138.             sysInterfaceTimerInvokeMapper.insert(sysInterfaceTimerInvoke);   
  139.         } catch (HttpException e) {   
  140.             e.printStackTrace();   
  141.         } catch (IOException e) {   
  142.             e.printStackTrace();   
  143.         }   
  144.     }   
  145.        
  146.     private String parseJSON(String valueString , List<SysInterfaceParams> selectByTemplateId){   
  147.         // JSON表达式,类似于 3&4&5
      
  148.         String[] json = valueString.split("\\$");   
  149.         StringBuffer stringBuffer = new StringBuffer();   
  150.         stringBuffer.append("{");   
  151.         for (String n : json) {   
  152.             String paramkey = selectByTemplateId.get(Integer.parseInt(n)-1).getParamkey();   
  153.             String paramvalue = selectByTemplateId.get(Integer.parseInt(n)-1).getParamvalue();   
  154.                
  155. //          if(paramvalue.indexOf("\\$") > 0 ){
      
  156. //              parseJSON(paramvalue,selectByTemplateId);
      
  157. //          }     //用不到啦
      
  158.                
  159.             stringBuffer.append("\""  
  160.                     + paramkey   
  161.                     + "\"" + ":" + "\""  
  162.                     + paramvalue   
  163.                     + "\"");   
  164.             stringBuffer.append(",");   
  165.         }   
  166.         stringBuffer.deleteCharAt(stringBuffer.length() - 1);   
  167.         stringBuffer.append("}");   
  168.            
  169.         return stringBuffer.toString();   
  170.     }   
  171.        
  172.     /**
     
  173.      * 发送请求  
  174.      * @return
     
  175.      * @throws IOException 
     
  176.      * @throws HttpException 
     
  177.      */  
  178.     public String sendRequest(List<NameValuePair> lists, String type, String url, String params) throws HttpException, IOException{
      
  179.         String responseBodyAsString ;   
  180.            
  181.         GetMethod getMethod = null;   
  182.         PostMethod postMethod = null;   
  183.            
  184.         try {   
  185.             if(type.equalsIgnoreCase("get")){   
  186.                 if (params.trim().equals("")) {   
  187.                     getMethod = new GetMethod(url);   
  188.                 } else {   
  189.                     getMethod = new GetMethod(url + "?" + params);   
  190.                 }   
  191.                 HttpClient httpClient = new HttpClient();   
  192.                 httpClient.executeMethod(getMethod);   
  193.                 responseBodyAsString = getMethod.getResponseBodyAsString();   
  194.                 getMethod.releaseConnection();   
  195.             }else{   
  196.                 postMethod = new GBKPostMethod(url);   
  197.                 NameValuePair[] data = new NameValuePair[lists.size()];   
  198.                 for (int i = 0; i < lists.size(); i++) {
      
  199.                     data[i] = lists.get(i);   
  200.                 }   
  201.                 postMethod.setRequestBody(data);   
  202.                 HttpClient httpClient = new HttpClient();   
  203.                 httpClient.executeMethod(postMethod);   
  204.                 responseBodyAsString = postMethod.getResponseBodyAsString();   
  205.                 postMethod.releaseConnection();   
  206.             }   
  207.         } catch (Exception e) {   
  208.             e.printStackTrace();   
  209.             responseBodyAsString = "Exception :"+e.getMessage();   
  210.             return responseBodyAsString;   
  211.         } finally{   
  212.             if (getMethod != null) {   
  213.                 getMethod.releaseConnection();   
  214.             }   
  215.             if(postMethod != null){   
  216.                 postMethod.releaseConnection();   
  217.             }   
  218.         }   
  219.            
  220.            
  221.         return responseBodyAsString;   
  222.     }   
  223. }  

 

 

任务监听接口

 

Java代码  
  1. package com.besttone.mobile.mcipm.util.interfaceTask;   
  2.   
  3. import java.util.Collection;   
  4. import java.util.Date;   
  5. import java.util.Map;   
  6.   
  7. import org.quartz.JobDataMap;   
  8. import org.quartz.JobExecutionContext;   
  9. import org.quartz.JobExecutionException;   
  10. import org.quartz.JobListener;   
  11. import org.quartz.SchedulerException;   
  12. import org.quartz.TriggerKey;   
  13.   
  14. import com.besttone.mobile.mcipm.dao.SysInterfaceTimerTaskMapper;   
  15. import com.besttone.mobile.mcipm.model.SysInterfaceTimerTask;   
  16. import com.besttone.mobile.mcipm.util.SpringContextUtil;   
  17.   
  18. public class MyJobListener implements JobListener {
      
  19.        
  20.     private SysInterfaceTimerTaskMapper sysInterfaceTimerTaskMapper = (SysInterfaceTimerTaskMapper) SpringContextUtil.getBean("sysInterfaceTimerTaskMapper");
      
  21.        
  22.     @Override  
  23.     public String getName() {   
  24.         return "myJobListenerName";   
  25.     }   
  26.        
  27.     @Override  
  28.     public void jobExecutionVetoed(JobExecutionContext arg0) {
      
  29.   
  30.     }   
  31.   
  32.     @Override  
  33.     public void jobToBeExecuted(JobExecutionContext context) {
      
  34.         System.out.println("任务开始进行了");   
  35.     }   
  36.   
  37.     @Override  
  38.     public void jobWasExecuted(JobExecutionContext context,
      
  39.             JobExecutionException arg1) {   
  40.            
  41.         JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();   
  42.         Map<String, Object> wrappedMap = jobDataMap.getWrappedMap();   
  43.         Collection<Object> values = wrappedMap.values();   
  44.            
  45.         String templateId = null;    
  46.         for (Object object : values) {   
  47.             templateId = (String)object;  //获得当前任务的ID号
      
  48.         }   
  49.            
  50.         try {   
  51.             /* 设置为  一个触发器触发一个任务
     
  52.              * 获得当前触发器的下一次执行时间,如果为null的话
     
  53.              * 则表示当前的任务已经执行完
     
  54.             */  
  55.             Date nextFireTime = context.getScheduler().getTrigger(new TriggerKey(templateId,templateId)).getNextFireTime();   
  56.                
  57.             //当任务的下一次执行时间为null的时候,表示任务已经结束了,此时将任务的运行状态设置为停止 (0)
      
  58.             if(nextFireTime == null){    
  59.                 SysInterfaceTimerTask selectByTemplateID = sysInterfaceTimerTaskMapper.selectByTemplateID(templateId);   
  60.                 selectByTemplateID.setIsRun("0");   
  61.                 sysInterfaceTimerTaskMapper.updateByTempId(selectByTemplateID);   
  62.             }   
  63.         } catch (SchedulerException e) {   
  64.             e.printStackTrace();   
  65.         }   
  66.            
  67.         System.out.println("任务执行完成了");   
  68.   
  69.     }   
  70.   
  71. }  

 

 

 

至此,计划任务基本完成。

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.