java配置自动任务,定期执行代码

任务调用类:

  1 package business.tools.service;
  2
  3 import java.util.ArrayList;
  4 import java.util.Calendar;
  5 import java.util.Date;
  6 import java.util.List;
  7
  8 import org.apache.commons.logging.Log;
  9 import org.apache.commons.logging.LogFactory;
 10 import org.quartz.CronTrigger;
 11 import org.quartz.Job;
 12 import org.quartz.JobDetail;
 13 import org.quartz.Scheduler;
 14 import org.quartz.SchedulerException;
 15 import org.quartz.SchedulerFactory;
 16 import org.quartz.impl.StdSchedulerFactory;
 17
 18 import business.tools.model.SalesDataMonitor;
 19 import framework.corenew.DateFormatException;
 20 import framework.corenew.MyString;
 21 import framework.corenew.QDateTime;
 22 import framework.corenew.UniversalManager;
 23
 24 public class SalesDataMonitorManager extends UniversalManager{
 25     private transient final static Log log = LogFactory.getLog(SalesDataMonitorManager.class);
 26     private static SchedulerFactory sf ;
 27     public static synchronized SchedulerFactory getSf() {
 28          if(sf==null){
 29             sf = new StdSchedulerFactory();
 30          }
 31           return sf;
 32       }
 33
 34
 35     /**
 36      * 保存销售数据范围时设定自动任务
 37      * @param salesDataMonitor
 38      * @throws Exception
 39      */
 40     public  void saveSalesMonitorJob(SalesDataMonitor salesDataMonitor) throws Exception{
 41         if(salesDataMonitor==null){
 42             return;
 43         }
 44         if("1".equals(salesDataMonitor.getType())){//如果type==1的不是监控范围数据
 45             return;
 46         }
 47
 48         List<String> formartTimes = getFormatTime(salesDataMonitor);//对象中包含的任务时间
 49         if(formartTimes==null||formartTimes.size()==0){
 50             return;
 51         }
 52
 53         removeJobs(salesDataMonitor.getId(), "salesDataMonitorGroup");//删除任务
 54
 55         for(String formartTime:formartTimes){
 56             String jobName = getJobName(salesDataMonitor, formartTime);
 57             Job job = (Job)Class.forName("business.webservice.SalesDataMonitorJob").newInstance();
 58             Scheduler sched = getSf().getScheduler();
 59             JobDetail jobDetail = new JobDetail(jobName, "salesDataMonitorGroup", job.getClass());
 60             jobDetail.getJobDataMap().put("salesDataMonitorId", salesDataMonitor.getId());
 61             //触发器
 62             CronTrigger  trigger = new CronTrigger(jobName, "salesDataMonitorGroup");
 63             trigger.setCronExpression(formartTime);//触发器时间设定
 64             sched.scheduleJob(jobDetail,trigger);
 65             //启动
 66             if(!sched.isShutdown())
 67                sched.start();
 68
 69             log.info("===============================任务添加成功!");
 70         }
 71
 72     }
 73
 74  /**
 75     * 拼出任务执行时间
 76     * @param startTime
 77     * @param endTime
 78     * @param interval
 79     * @return
 80     * @throws DateFormatException
 81     */
 82     private  List<String> getFormatTime(SalesDataMonitor salesDataMonitor) throws Exception{
 83         List<String> strList = new ArrayList<String>();
 84
 85         String catchDataType = salesDataMonitor.getCatchDataType();//抓取类型
 86         if("1".equals(catchDataType)){
 87             String weekDayStr = "";//周几的字符串
 88             String weekDays = salesDataMonitor.getWeekDays();
 89             if(MyString.isNoEmpty(weekDays)){
 90                 String[] weekDaysArr = weekDays.split("~");
 91                 for(int i=0;i<weekDaysArr.length;i++){
 92                     if(MyString.isNoEmpty(weekDaysArr[i])){
 93                         weekDayStr+=weekDaysArr[i];
 94                         if(i<weekDaysArr.length-1){
 95                             weekDayStr+=",";
 96                         }
 97                     }
 98
 99                 }
100             }
101
102             String hoursAndMinutes = salesDataMonitor.getHoursAndMinutes();
103             if(MyString.isNoEmpty(hoursAndMinutes)){
104                 String[] hoursAndMinutesArr = hoursAndMinutes.split("~");
105                 for(int i=0;i<hoursAndMinutesArr.length;i++){
106                     String[] hourAndMinuteArr = hoursAndMinutesArr[i].split(":");
107                     String hourStr = hourAndMinuteArr[0];
108                     String minuteStr = hourAndMinuteArr[1];
109
110                     StringBuffer formartTime = new StringBuffer();
111                     formartTime.append("0 ");
112                     formartTime.append(minuteStr+" ");
113                     formartTime.append(hourStr+" ? * ");
114                     formartTime.append(weekDayStr);//周的表示 用MON-SUN或者1-7,不过注意:数字1是周日,2是周一,依次向下推
115
116
117                     strList.add(formartTime.toString());
118
119                 }
120             }
121         }else if("2".equals(catchDataType)){
122             try{
123                 String fixedTimes = salesDataMonitor.getFixedTimes();
124                 if(MyString.isNoEmpty(fixedTimes)){
125                     String[] fixedTimesArr = fixedTimes.split("~");
126                     for(int i=0;i<fixedTimesArr.length;i++){
127                         Date fixedTime = QDateTime.stringToDate(fixedTimesArr[i], "yyyy-MM-dd HH:mi");
128                         int compared = compareTimeToNow(fixedTime);
129                         if(compared==1){
130                             throw new Exception("您填写的时间已过期,请核对!");
131                         }
132                         String yearStr = QDateTime.dateToString(fixedTime, "yyyy");
133                         String monthStr = QDateTime.dateToString(fixedTime, "MM");
134                         String dateStr = QDateTime.dateToString(fixedTime, "dd");
135
136                         String hourStr = QDateTime.dateToString(fixedTime, "HH");
137                         String minStr = QDateTime.dateToString(fixedTime, "mi");
138
139                         StringBuffer formartTime = new StringBuffer();
140                         formartTime.append("0 ") ;
141                         formartTime.append(minStr+" ");
142                         formartTime.append(hourStr+" ");
143                         formartTime.append(dateStr+" ");
144                         formartTime.append(monthStr+" ? ");
145                         formartTime.append(yearStr);
146
147                         strList.add(formartTime.toString());
148
149                     }
150                 }
151             }catch(Exception e){
152                 e.printStackTrace();
153             }
154         }
155
156         log.info("自动任务触发时间:======"+strList.toString());
157         return strList;
158     }
159     /**
160      * 一个日期和当前时间比较
161      * @param time
162      * @return
163      * @throws DateFormatException
164      */
165     private int compareTimeToNow(Date time) throws DateFormatException{
166
167         Calendar inTime = Calendar.getInstance();
168         inTime.setTime(time);
169
170         Calendar nowTime = Calendar.getInstance();
171         String currentTimeStr = QDateTime.dateToString(new Date(), "yyyy-MM-dd HH:mi");
172         Date currentTime = QDateTime.stringToDate(currentTimeStr, "yyyy-MM-dd HH:mi");
173         nowTime.setTime(currentTime);
174
175         int compared = nowTime.compareTo(inTime);
176         return compared;
177     }
178
179
180     private String getJobName(SalesDataMonitor salesDataMonitor,String formartTime) throws Exception{
181         //拼出任务名字
182         StringBuffer jobName = new StringBuffer();
183         jobName.append(salesDataMonitor.getId());//id
184         jobName.append("φ");
185         jobName.append(salesDataMonitor.getBusinessType());//国际国内
186         jobName.append("φ");
187         jobName.append(salesDataMonitor.getCarrierCode());//航空公司
188         jobName.append("φ");
189         jobName.append(salesDataMonitor.getClasses());//舱位
190         jobName.append("φ");
191         jobName.append(salesDataMonitor.getDepArea()+"-"+salesDataMonitor.getArrArea());//区域
192         jobName.append("φ");
193         jobName.append(salesDataMonitor.getIsArrival());//是限定还是排除
194         jobName.append("φ");
195         jobName.append(salesDataMonitor.getDeparture()+"-"+salesDataMonitor.getArrival());//限定和排除的机场三字码
196         jobName.append("φ");
197         jobName.append(salesDataMonitor.getTourDateBegins()+"-"+salesDataMonitor.getTourDateEnds());//旅行时间
198         jobName.append("φ");
199         jobName.append(salesDataMonitor.getEtdzBegins()+"-"+salesDataMonitor.getEtdzEnds());//出票时间
200         jobName.append("φ");
201         jobName.append(salesDataMonitor.getCatchDataType());//抓取类型
202         jobName.append("φ");
203         jobName.append(formartTime);//任务时间
204
205         return jobName.toString();
206     }
207
208     public  void removeJobs(String objectId,String groupName) throws SchedulerException{
209         if(!MyString.isNoEmpty(objectId)){
210             return;
211         }
212         Scheduler sched = getSf().getScheduler();
213         String[] jobNames = sched.getJobNames(groupName);
214         if(jobNames==null||jobNames.length==0){
215             return;
216         }
217         for(String jobName :jobNames){
218             if(jobName.startsWith(objectId)){
219                 removeJob(jobName);//清除任务
220             }
221         }
222
223
224     }
225     /**
226      * 删除任务
227      * @param jobName
228      * @throws SchedulerException
229      */
230    public static void removeJob(String jobName)
231            throws SchedulerException{
232         Scheduler sched = getSf().getScheduler();
233         sched.pauseTrigger(jobName,"salesDataMonitorGroup");//停止触发器
234         sched.unscheduleJob(jobName,"salesDataMonitorGroup");//移除触发器
235         sched.deleteJob(jobName,"salesDataMonitorGroup");//删除任务
236         log.info("删除任务成功!");
237     }
238 }

任务类:Job

 1 package business.webservice;
 2
 3
 4 import java.util.Date;
 5
 6 import org.apache.commons.logging.Log;
 7 import org.apache.commons.logging.LogFactory;
 8 import org.quartz.Job;
 9 import org.quartz.JobExecutionContext;
10 import org.quartz.JobExecutionException;
11
12 import business.tools.service.BookinfoManager;
13 import framework.corenew.QDateTime;
14 import framework.corenew.SpringUtil;
15
16 public class SalesDataMonitorJob  implements Job{
17     private transient final Log log = LogFactory.getLog(SalesDataMonitorJob.class);
18
19     public void execute(JobExecutionContext jobEC) throws JobExecutionException {
20         String currentTime = QDateTime.dateToString(new Date(), "yyyy-MM-dd HH:mi:ss");
21         log.info("===================调用SalesDataMonitorJob时间  :"+currentTime+"=====================");
22
23         String salesDataMonitorId = (String)jobEC.getJobDetail().getJobDataMap().get("salesDataMonitorId");
24
25         try {
26             BookinfoManager bookinfoManager = (BookinfoManager) SpringUtil.getBean("bookinfoManager");
27             bookinfoManager.saveGroupBookInfoBySalesDataMonitor(salesDataMonitorId);
28         } catch (Exception e) {
29             e.printStackTrace();
30         }
31
32
33     }
34
35
36 }

时间的格式拼法详见下章

时间: 2024-10-22 06:49:40

java配置自动任务,定期执行代码的相关文章

如何让django方法自动地定期执行

实现思路:1.首先把需要自动执行的django method写成django command2.将自己定义的django command添加到cron中使用cron服务实现定期执行 Part1 在django工程中添加自定义的django command1.我们自己建立的application叫做myapp,首先在这个app目录下,我们需要新建management目录,这个目录里应该包括:__init__.py(内容为空,用于打包)和commands目录,然后在commands目录下包括:__i

Spring配置自动加载执行多次的解决方法

首先我的情况网上的方法都没用,这个是反复加载Service的问题,具体不说了 解决方法如下: 单独弄一个配置文件,需要自动加载的全部放里面去.不要忘了改web.xml让它扫描 配置文档里面一共三种方法,用自定义那个,如下 <task:scheduled-tasks> <task:scheduled ref="TestService" method="Test" cron="00 00,10,20,30,40,50 * * * *"

用Eclipse编辑AndroidXML文件,配置自动提示。

用Eclipse编辑AndroidXML文件,配置自动提示. - 好代码编程网 在Eclipse下开发Android应用时,避免不了编辑xml文件,如layout.string.drawable等等. Android xml体系庞大,很多开发者都是记者标签的关键字,所以在编辑xml文件时自动提示必不可少.但是很多人遇到在Eclipse中编辑xml没有自动提示的问题.按快捷键也不成. 下面介绍一下在Eclipse的Editor下为Android xml编辑配置自动提示的方法. 首先说明我的Ecli

配置eclipse编写html/js/css/jsp/java时自动提示

配置eclipse编写html/js/css/jsp/java时自动提示步骤: 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zjava   点击apply按钮 如图: 2.继续打开JavaScript→Editor→Content Assist 修改Auto Activation triggers for JavaScript的值为:zjs  

【spring-boot】spring-boot项目中,通过JAVA配置类形式配置前台代码都重定向转发

以下是MyMvcConfig.java配置类的代码,可供参考: package com.springboot.config; import com.springboot.conponent.LoginHanderInterceptor; import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; import org.springframework.context.annotation.Be

【BigData】Java基础_Eclipse配置自动补全new

需求描述 在使用Eclipse的时候,每次new一个对象,写起来比较麻烦,以下是配置Eclipse,然后使用快捷键补全new方法的步骤,此配置使用官方属于叫做:配置自动分配局部变量 配置步骤 打开Window--->>Preferences,出现以下界面 修改前 修改后 原文地址:https://www.cnblogs.com/OliverQin/p/12077562.html

配置VIM下编程和代码阅读环境

作者:gnuhpc from http://blog.csdn.net/gnuhpc  http://gnuhpc.wordpress.com/ 本文环境:ubuntu 10.10/vim7.2 基本配置1) 建立基本环境: 建立三个目录:mkdir ~/.vim/{plugin,doc,syntax} -p 建立配置文件:touch ~/.vimrc .vimrc是vim的主要配置文件,我们在配置VIM时首先对它进行基本的设置.打开home目录下刚刚建立的.vimrc文件,可以对VIM进行如下

优云实践:巧用Salt,实现CMDB配置自动发现

随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)IT时代,信息化环境越来越复杂,既有IOE三层架构,也有VCE.Openstack等云虚拟化架构和互联网化的分布式大数据架构.所以,企业急需建立一套合适的配置管理库(CMDB),像人类"大脑"一样统一存储从基础架构到业务应用各层面的配置信息,以便协调"身体"(运维系统)各部分完成复杂的运维工作. CMDB如此重要,但又是运维中最难建设好的部分,就连很多IT运维界大佬都感叹CMDB是运维人的最痛点,他们总结C

C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon) 系列三: windows service系列三--制作可控制界面的windows service 一.经常有人问起如何让程序定期自动执行? 除了像系统任务和SQL JOB/DTS等都可以满足不同的用户需求外,这里演示了如何做一个简单的windows serivce的框架.主要的功能是按照