任务调用类:

 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. 如何准确进行T+0操作

    如何准确进行T+0操作 http://tangulunjin.com.cn/t0.html 常用的几种T+0模式 1.受外盘或者个股利好高开,高开一般在10点之前会有个回抽昨日收盘价的下跌波.特别是弱 ...

  2. [摘录]quarts :overview

    最近项目用了quarts 这个 任务调度器.今天开始详细的学习学习.参考链接:http://www.quartz-scheduler.org/# Quartz Enterprise Job Sched ...

  3. C++之路起航——标准模板库(queue)

    queue: FIFO队列:先进先出队列. 优先队列:对队列中的元素按优先级的大小输出. 定义: FIFO队列: queue<数据类性>变量名. 优先队列:priority_queue&l ...

  4. ARM 寄存器的介绍

    ARM  寄存器  31个通用, 32个程序状态寄存器 怎么算的呢: (R0--R15)   16  +  7 + 8  =31 通用 程序状态寄存器:    6 个 共  37 个. 不分组寄存器: ...

  5. paper 84:机器学习算法--随机森林

    http://www.cnblogs.com/wentingtu/archive/2011/12/13/2286212.html中一些内容 基础内容: 这里只是准备简单谈谈基础的内容,主要参考一下别人 ...

  6. oracle的例程

    oracle只有在具备sysoper和sysdba权限下才能启动和关闭例程 关闭例程: --正常关闭(等待当前连接的所有用户与数据库断开) shutdown normal; --立即关闭(回退活动的事 ...

  7. Bug测试报告--俄罗斯方块--新蜂

    项目名:俄罗斯方块 组名:新蜂 测试者:韩媛媛(nice!团队) 用户需求规格说明书URL:http://www.cnblogs.com/Boxer1994/p/6084035.html 组长博客UR ...

  8. [待解决] sudo unable to resolve host

    怪哉怪哉, 大debian突然就出现了这个问题 , 问题的现象是只要使用 sudo 执行命令就会出现 sudo unable to resolve host </etc/hostname中的内容 ...

  9. 怎么开启PHP 的错误提示?

    怎么开启PHP 的错误提示?   在php.ini 修改error_reporting = E_ALL & ~E_NOTICEdisplay_errors = On重启apache服务器在运行 ...

  10. $.trim()函数

    $.trim(str) 返回:string: 参数str :String类型,需要去除两端空白字符的字符串.如果参数str不是字符串类型,该函数将自动将其转为字符串(一般调用其toString()方法 ...