java配置自动任务,定期执行代码
任务调用类:
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配置自动任务,定期执行代码的更多相关文章
- 如何让django方法自动地定期执行
实现思路:1.首先把需要自动执行的django method写成django command2.将自己定义的django command添加到cron中使用cron服务实现定期执行 Part1 在dj ...
- Python使用闭包结合配置自动生成函数
背景 在构建测试用例集时,常常需要编写一些函数,这些函数接受基本相同的参数,仅有一个参数有所差异,并且处理模式也非常相同.可以使用Python闭包来定义模板函数,然后通过参数调节来自动化生产不同的函数 ...
- java Web 启动时自动执行代码的几种方式
Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...
- Linux crontab定时器设置(定期执行java程序)(转)
Crontab 语法 Crontab语法一个crontab文件用五个段来定义:天,日期和时间,和一个要定期执行的命令代码. * * * * * command to be execut ...
- Applet是java的自动执行方式(这是它的优势,主要用于HTML)
进度条:ProgressBar. JcomboBox:下拉菜单:在AWT中同类组件是choice. JlistPanel:选择列表 BorderPanel:设置边框 JsplitPanel:可将容器分 ...
- java动态编译 (java在线执行代码后端实现原理)(二)
在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...
- java动态编译 (java在线执行代码后端实现原理)
需求:要实现一个web网页中输入java代码,然后能知道编译结果以及执行结果 类似于菜鸟java在线工具的效果:https://c.runoob.com/compile/10 刚开始从什么概念都没有到 ...
- Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)
Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353) 一.漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,jenkins利用此通道来接收命令,恶 ...
- 配置eclipse编写html/js/css/jsp/java时自动提示
配置eclipse编写html/js/css/jsp/java时自动提示步骤: 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修 ...
随机推荐
- csuoj 1329: 一行盒子
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329 1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 12 ...
- 输入和输出的总结(c语言)
c语言中有多种的输入和输出方式,下面就简单总结一下: 一.输入的三种方式 (1)scanf scanf 函数可以在变量中使用,也可以在数组中使用,当然指针上也能用到,是一个很好的输入函数.scanf是 ...
- fences(桌面整理软件)与eDiary3.3.3下载链接
fences: http://www.jb51.net/softs/309746.html http://jingyan.baidu.com/article/e8cdb32b6e958337042b ...
- Java基础(31):String的大小写转换、分离成数组、==与equals()的区别(String类)
继续来看 String 类常用的方法,如下代码所示: 运行结果: 那么,“==” 和 equals() 有什么区别呢? ==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象 eq ...
- JavaScript: basis
ref: http://www.imooc.com/code/387 1. html里直接嵌入js: <!DOCTYPE HTML> <html> <head> & ...
- Could not create the view: An unexpected exception was thrown.问题解决
Could not create the view: An unexpected exception was thrown.问题解决 今天打开Myeclipse10的时候,发现server窗口出现一堆 ...
- Android so lib库远程http下载和动态注册
一.背景 在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过 ...
- bzoj4216 Pig
水题,题目难点大概就是空间限制上了,开longlong会爆,可以开个int数组求前缀和,然后一旦绝对值超过20亿,则将其取模,并记录下当前位置,这样询问时就可以二分这些超过的位置,将其乘以20亿后加上 ...
- 解决无法连接到visual studio开发服务器的问题
今天vs抽风,调试网站出现下图那样: 然后我开始百度搜索 "无法连接到visual studio开发服务器" 出现很多文章: 打开一篇问题,看了里面的内容, 那个解决办法也不是最好 ...
- [待解决] sudo unable to resolve host
怪哉怪哉, 大debian突然就出现了这个问题 , 问题的现象是只要使用 sudo 执行命令就会出现 sudo unable to resolve host </etc/hostname中的内容 ...