任务调用类:

 package business.tools.service;

 import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory; import business.tools.model.SalesDataMonitor;
import framework.corenew.DateFormatException;
import framework.corenew.MyString;
import framework.corenew.QDateTime;
import framework.corenew.UniversalManager; public class SalesDataMonitorManager extends UniversalManager{
private transient final static Log log = LogFactory.getLog(SalesDataMonitorManager.class);
private static SchedulerFactory sf ;
public static synchronized SchedulerFactory getSf() {
if(sf==null){
sf = new StdSchedulerFactory();
}
return sf;
} /**
* 保存销售数据范围时设定自动任务
* @param salesDataMonitor
* @throws Exception
*/
public void saveSalesMonitorJob(SalesDataMonitor salesDataMonitor) throws Exception{
if(salesDataMonitor==null){
return;
}
if("1".equals(salesDataMonitor.getType())){//如果type==1的不是监控范围数据
return;
} List<String> formartTimes = getFormatTime(salesDataMonitor);//对象中包含的任务时间
if(formartTimes==null||formartTimes.size()==0){
return;
} removeJobs(salesDataMonitor.getId(), "salesDataMonitorGroup");//删除任务 for(String formartTime:formartTimes){
String jobName = getJobName(salesDataMonitor, formartTime);
Job job = (Job)Class.forName("business.webservice.SalesDataMonitorJob").newInstance();
Scheduler sched = getSf().getScheduler();
JobDetail jobDetail = new JobDetail(jobName, "salesDataMonitorGroup", job.getClass());
jobDetail.getJobDataMap().put("salesDataMonitorId", salesDataMonitor.getId());
//触发器
CronTrigger trigger = new CronTrigger(jobName, "salesDataMonitorGroup");
trigger.setCronExpression(formartTime);//触发器时间设定
sched.scheduleJob(jobDetail,trigger);
//启动
if(!sched.isShutdown())
sched.start(); log.info("===============================任务添加成功!");
} } /**
* 拼出任务执行时间
* @param startTime
* @param endTime
* @param interval
* @return
* @throws DateFormatException
*/
private List<String> getFormatTime(SalesDataMonitor salesDataMonitor) throws Exception{
List<String> strList = new ArrayList<String>(); String catchDataType = salesDataMonitor.getCatchDataType();//抓取类型
if("1".equals(catchDataType)){
String weekDayStr = "";//周几的字符串
String weekDays = salesDataMonitor.getWeekDays();
if(MyString.isNoEmpty(weekDays)){
String[] weekDaysArr = weekDays.split("~");
for(int i=0;i<weekDaysArr.length;i++){
if(MyString.isNoEmpty(weekDaysArr[i])){
weekDayStr+=weekDaysArr[i];
if(i<weekDaysArr.length-1){
weekDayStr+=",";
}
} }
} String hoursAndMinutes = salesDataMonitor.getHoursAndMinutes();
if(MyString.isNoEmpty(hoursAndMinutes)){
String[] hoursAndMinutesArr = hoursAndMinutes.split("~");
for(int i=0;i<hoursAndMinutesArr.length;i++){
String[] hourAndMinuteArr = hoursAndMinutesArr[i].split(":");
String hourStr = hourAndMinuteArr[0];
String minuteStr = hourAndMinuteArr[1]; StringBuffer formartTime = new StringBuffer();
formartTime.append("0 ");
formartTime.append(minuteStr+" ");
formartTime.append(hourStr+" ? * ");
formartTime.append(weekDayStr);//周的表示 用MON-SUN或者1-7,不过注意:数字1是周日,2是周一,依次向下推 strList.add(formartTime.toString()); }
}
}else if("2".equals(catchDataType)){
try{
String fixedTimes = salesDataMonitor.getFixedTimes();
if(MyString.isNoEmpty(fixedTimes)){
String[] fixedTimesArr = fixedTimes.split("~");
for(int i=0;i<fixedTimesArr.length;i++){
Date fixedTime = QDateTime.stringToDate(fixedTimesArr[i], "yyyy-MM-dd HH:mi");
int compared = compareTimeToNow(fixedTime);
if(compared==1){
throw new Exception("您填写的时间已过期,请核对!");
}
String yearStr = QDateTime.dateToString(fixedTime, "yyyy");
String monthStr = QDateTime.dateToString(fixedTime, "MM");
String dateStr = QDateTime.dateToString(fixedTime, "dd"); String hourStr = QDateTime.dateToString(fixedTime, "HH");
String minStr = QDateTime.dateToString(fixedTime, "mi"); StringBuffer formartTime = new StringBuffer();
formartTime.append("0 ") ;
formartTime.append(minStr+" ");
formartTime.append(hourStr+" ");
formartTime.append(dateStr+" ");
formartTime.append(monthStr+" ? ");
formartTime.append(yearStr); strList.add(formartTime.toString()); }
}
}catch(Exception e){
e.printStackTrace();
}
} log.info("自动任务触发时间:======"+strList.toString());
return strList;
}
/**
* 一个日期和当前时间比较
* @param time
* @return
* @throws DateFormatException
*/
private int compareTimeToNow(Date time) throws DateFormatException{ Calendar inTime = Calendar.getInstance();
inTime.setTime(time); Calendar nowTime = Calendar.getInstance();
String currentTimeStr = QDateTime.dateToString(new Date(), "yyyy-MM-dd HH:mi");
Date currentTime = QDateTime.stringToDate(currentTimeStr, "yyyy-MM-dd HH:mi");
nowTime.setTime(currentTime); int compared = nowTime.compareTo(inTime);
return compared;
} private String getJobName(SalesDataMonitor salesDataMonitor,String formartTime) throws Exception{
//拼出任务名字
StringBuffer jobName = new StringBuffer();
jobName.append(salesDataMonitor.getId());//id
jobName.append("φ");
jobName.append(salesDataMonitor.getBusinessType());//国际国内
jobName.append("φ");
jobName.append(salesDataMonitor.getCarrierCode());//航空公司
jobName.append("φ");
jobName.append(salesDataMonitor.getClasses());//舱位
jobName.append("φ");
jobName.append(salesDataMonitor.getDepArea()+"-"+salesDataMonitor.getArrArea());//区域
jobName.append("φ");
jobName.append(salesDataMonitor.getIsArrival());//是限定还是排除
jobName.append("φ");
jobName.append(salesDataMonitor.getDeparture()+"-"+salesDataMonitor.getArrival());//限定和排除的机场三字码
jobName.append("φ");
jobName.append(salesDataMonitor.getTourDateBegins()+"-"+salesDataMonitor.getTourDateEnds());//旅行时间
jobName.append("φ");
jobName.append(salesDataMonitor.getEtdzBegins()+"-"+salesDataMonitor.getEtdzEnds());//出票时间
jobName.append("φ");
jobName.append(salesDataMonitor.getCatchDataType());//抓取类型
jobName.append("φ");
jobName.append(formartTime);//任务时间 return jobName.toString();
} public void removeJobs(String objectId,String groupName) throws SchedulerException{
if(!MyString.isNoEmpty(objectId)){
return;
}
Scheduler sched = getSf().getScheduler();
String[] jobNames = sched.getJobNames(groupName);
if(jobNames==null||jobNames.length==0){
return;
}
for(String jobName :jobNames){
if(jobName.startsWith(objectId)){
removeJob(jobName);//清除任务
}
} }
/**
* 删除任务
* @param jobName
* @throws SchedulerException
*/
public static void removeJob(String jobName)
throws SchedulerException{
Scheduler sched = getSf().getScheduler();
sched.pauseTrigger(jobName,"salesDataMonitorGroup");//停止触发器
sched.unscheduleJob(jobName,"salesDataMonitorGroup");//移除触发器
sched.deleteJob(jobName,"salesDataMonitorGroup");//删除任务
log.info("删除任务成功!");
}
}

任务类:Job

 package business.webservice;

 import java.util.Date;

 import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import business.tools.service.BookinfoManager;
import framework.corenew.QDateTime;
import framework.corenew.SpringUtil; public class SalesDataMonitorJob implements Job{
private transient final Log log = LogFactory.getLog(SalesDataMonitorJob.class); public void execute(JobExecutionContext jobEC) throws JobExecutionException {
String currentTime = QDateTime.dateToString(new Date(), "yyyy-MM-dd HH:mi:ss");
log.info("===================调用SalesDataMonitorJob时间 :"+currentTime+"====================="); String salesDataMonitorId = (String)jobEC.getJobDetail().getJobDataMap().get("salesDataMonitorId"); try {
BookinfoManager bookinfoManager = (BookinfoManager) SpringUtil.getBean("bookinfoManager");
bookinfoManager.saveGroupBookInfoBySalesDataMonitor(salesDataMonitorId);
} catch (Exception e) {
e.printStackTrace();
} } }

时间的格式拼法详见下章

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

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

    实现思路:1.首先把需要自动执行的django method写成django command2.将自己定义的django command添加到cron中使用cron服务实现定期执行 Part1 在dj ...

  2. Python使用闭包结合配置自动生成函数

    背景 在构建测试用例集时,常常需要编写一些函数,这些函数接受基本相同的参数,仅有一个参数有所差异,并且处理模式也非常相同.可以使用Python闭包来定义模板函数,然后通过参数调节来自动化生产不同的函数 ...

  3. java Web 启动时自动执行代码的几种方式

    Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...

  4. Linux crontab定时器设置(定期执行java程序)(转)

    Crontab 语法 Crontab语法一个crontab文件用五个段来定义:天,日期和时间,和一个要定期执行的命令代码. *    *  *  *   *  command to be execut ...

  5. Applet是java的自动执行方式(这是它的优势,主要用于HTML)

    进度条:ProgressBar. JcomboBox:下拉菜单:在AWT中同类组件是choice. JlistPanel:选择列表 BorderPanel:设置边框 JsplitPanel:可将容器分 ...

  6. java动态编译 (java在线执行代码后端实现原理)(二)

    在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...

  7. java动态编译 (java在线执行代码后端实现原理)

    需求:要实现一个web网页中输入java代码,然后能知道编译结果以及执行结果 类似于菜鸟java在线工具的效果:https://c.runoob.com/compile/10 刚开始从什么概念都没有到 ...

  8. Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)

    Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353) 一.漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,jenkins利用此通道来接收命令,恶 ...

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

    配置eclipse编写html/js/css/jsp/java时自动提示步骤: 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修 ...

随机推荐

  1. SQL 2008 数据库只读 修改

        先对数据库分离 数据库鼠标右键->任务->分离   将UsersDB.mdf UsersDB_log.LDF文件 属性->安全->编辑   两个文件的都要更改权限   ...

  2. m球求n盒子问题

    球同盒同可空盒问题 #include <bits/stdc++.h> using namespace std; const int N = 25; int dp[N][N]; int ma ...

  3. Spring中Bean的配置:基于注解的方式

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: -@Component:基本注解,标识一个受Spring管理的组件 -@Respositor ...

  4. Java实现数组按数值大小排序

    package shb.java.test; /** * 比较数组中元素的大小,按从大到小顺序排列. * @Package:shb.java.test * @Description: * @autho ...

  5. MVC4 下DropDownList使用方法

    与MVC3相比,差别很大: 表现形式一: public ActionResult Main() { List<SelectListItem> items = new List<Sel ...

  6. My sql 日期格式化

    DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 DATE_FORMAT(date,format) select DATE_FORMAT(NOW(),'%Y-%m-%d %H ...

  7. libsvm

    代码文件主要针对Matlab进行说明,但个人仍觉得讲解的支持向量机内容非常棒,可以做为理解这一统计方法的辅助资料; LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量 ...

  8. SQL—— 事务

    SQL 事务: 1.  定义: 事务是作为单个逻辑单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行.要么都不执行,事务是一个不可分割的工作逻辑单元.这特别适用于多用户同时操作的数据通信 ...

  9. Another app is currently holding the yum lock; waiting for it to exit...另一个应用程序在占用yum lock,等待其退出。

    这种情况下通常是由于yum的时候意外退出造成的,虽然也给出提示当前占用进行的id,但是执行kill -9 3599 强制杀死进程后,情况依然没能改变. 备注:(-9是强制杀死) 主要原因是因为,yum ...

  10. 清华大学出版社即将推出的又一本挂羊头卖狗肉的劣书 《C语言入门1.2.3—一个老鸟的C语言学习心得》

    http://www.tup.com.cn/book/showbook.asp?CPBH=051892-01