spring定时任务配置资料定时任务解决方案
两种方案,基本上都是一样,就是配置时间规则的时候,不一致。两种方案:CronTrigger基于日历和时间,SimpleTrigger基于时间。方案一是CronTrigger配置,方案二是SimpleTrigger配置。
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以...
定时任务解决
两种方案,基本上都是一样,就是配置时间规则的时候,不一致。两种方案:CronTrigger基于日历和时间,SimpleTrigger基于时间。方案一是CronTrigger配置,方案二是SimpleTrigger配置。
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。
SimpleTrigger 当需要在规定的时间执行一次或在规定的时间段以一定的时间间隔重复触发执行Job时,SimpleTrigger就可以满足要求;SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔,重复次数属性的值可以为0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY,重复的时间间隔属性值必须为0或长整型的正整数,以毫秒作为时间单位,当重复的时 间间隔为0时,意味着与Trigger同时触发执行(或几乎与Scheduler开始时同时触发执行)。如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建一个每间隔10秒钟触发一次直到指定的结束时间的 Trigger,而无需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性 值即可(我们也可以指定一个比在指定结束时间到达时实际执行次数大的重复次数)。
方案一
先写一个业务类,然后进行如下配置,一步都不能少,这样就能完成一个定时任务。
第一步 写一个业务类
package com.tcl.miss.sec.push.service.impl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.tcl.miss.sec.base.service.base.impl.BaseServiceImpl;
import com.tcl.miss.sec.push.service.IPushQueryService;
import com.tcl.miss.sec.push.service.IPushService;
@Service
public class PushService extends BaseServiceImpl implements IPushService {
private static final Logger log = Logger.getLogger(PushService.class);
String requestUrl = ResourceBundle.getBundle("config").getString("push_path");
private static boolean isRunning = false;
@Resource
private IPushQueryService pushQueryService;
public void pushService(){
if(isRunning){
return;
}
InputStream is = null;
InputStreamReader isr = null;
try {
isRunning = true;
JSONArray array = getJSONObject();
//String url = ":8080/messages";
URI uri = new URI(requestUrl);
SimpleClientHttpRequestFactory schr = new SimpleClientHttpRequestFactory();
ClientHttpRequest chr = schr.createRequest(uri, HttpMethod.POST);
//chr.getHeaders().set("Content-Type", "application/json;charset=UTF-8");
//③以GBK编码写出请求内容体
String jsonData = "param_data="+JSON.toJSONString(array);
chr.getBody().write(jsonData.getBytes("UTF-8"));
//④发送请求并得到响应
ClientHttpResponse res = chr.execute();
//System.out.println(res.getStatusCode()+"------------------");
//ClientHttpResponse res = chr.execute();
is = res.getBody(); // 获得返回数据,注意这里是个流
isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str = "";
while ((str = br.readLine()) != null) {
log.info(str);
//System.out.println(str);// 获得页面内容或返回内容
//System.out.println(new String(str.getBytes("ISO8859-1"),"UTF-8"));
}
} catch (Exception e) {
log.error("调用推送通用接口异常-----------------------------");
log.error(e.getMessage(), e);
} finally {
if(is != null){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(isr != null){
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
isRunning = false;
}
}
public JSONArray getJSONObject() throws Exception{
//查询有推送命令的设备
List
cmdList = pushQueryService.getDeviceCmds();
//查询有推送策略的设备
List policyList = pushQueryService.getDevicePolicy();
//查询有推送app的设备
List appList = pushQueryService.getAppList();
//查询有推送上报周期的设备
List repList = pushQueryService.getDeviceList();
//查询有推送黑名单的设备
List appBlackPushList = pushQueryService.getAppBlackPushList();
Map map = new HashMap();
//封装命令
for(String a : cmdList){
if(a!=null){
map.put(a,"1");
}
}
//封装策略
for(String a : policyList){
if(a!=null){
String s = map.get(a);
if(s == null){
map.put(a,"2");
}else{
map.put(a,s + ",2");
}
}
}
//封装app
for(String a : appList){
if(a!=null){
String s = map.get(a);
if(s == null){
map.put(a,"3");
}else{
map.put(a,s + ",3");
}
}
}
//下发周期推送
for(String a : repList){
if(a!=null){
String s = map.get(a);
if(s == null){
map.put(a,"4");
}else{
map.put(a,s + ",4");
}
}
}
//黑名单推送
for(String a : appBlackPushList){
if(a!=null){
String s = map.get(a);
if(s == null){
map.put(a,"5");
}else{
map.put(a,s + ",5");
}
}
}
if(map.size() > 0){
JSONArray array = new JSONArray();
for(Map.Entry entry : map.entrySet()){
JSONObject o = new JSONObject();
o.put("client_number",entry.getKey());
o.put("client_number_description","设备唯一码");
o.put("messages",entry.getValue());
o.put("system_name","MDM");
array.add(o);
}
return array;
}
return null;
}
}
这个业务很简单,不需要实现任务spring的接口。就是一个普通业务类,然后写一个业务方法。到时候配置定时任务,就会定时的执行这个业务方法。
第二步配置业务类
第三步配置定时任务目标对象和方法
pushService
第四步配置定时任务执行时间的规则
0/30 * * * * ?
注意延时启动
延时启动很重要,比如有的时候定时任务去查询数据库,这个时候可能spring还没有加载完,比如hibernate或其它持久层还没有加载完,就会报异常。一般定时任务对数据库的操作或者其它特殊操作,最好配置延时启动,让spring完全加载完,再执行定时任务。
CronTrigger
CronTrigger 支持比 SimpleTrigger 更具体的调度,而且也不是很复杂。基于 cron 表达式,CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔。
Cron 表达式包括以下 7 个字段:
格式:[秒][分][小时][日][月][周][年]序号是否必填允许填写的值允许的通配符1秒是0-59,-*/2分是0-59,-*/3小时是0-23,-*/4日是1-31,-*?/LW5月是1-12orJAN-DEC,-*/6周是1-7orSUN-SAT,-*?/L#7年否empty或1970-2099,-*/
通配符说明:
1. 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
2. 星号(*)字符是通配字符,表示该字段可以接受任何可能的值(例如:在分的字段上设置 "*",表示每一分钟都会触发)。
3. 问号(?)问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在月内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
4. - 表示区间,例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
5. 逗号(, ) 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
6. 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
7. L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"。
8. W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-")。
注:'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发。
常用示例
0 10 * * * ?--------------每个小时过10分执行一次
0 0/32 8,12 * * ? ----------每天8:32,12:32 执行一次
0 0/2 * * * ?--------------每2分钟执行一次
0 0 12 * * ?---------------在每天中午12:00触发
0 15 10 ? * *---------------每天上午10:15 触发
0 15 10 * * ?---------------每天上午10:15 触发
0 15 10 * * ? *---------------每天上午10:15 触发
0 15 10 * * ? 2005---------------在2005年中的每天上午10:15 触发
0 * 14 * * ?---------------每天在下午2:00至2:59之间每分钟触发一次
0 0/5 14 * * ?---------------每天在下午2:00至2:59之间每5分钟触发一次
0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之间的每5分钟触发一次
0 0-5 14 * * ?---------------每天在下午2:00至2:05之间每分钟触发一次
0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和2:44时触发
0 15 10 ? * MON-FRI---------------从星期一至星期五的每天上午10:15触发
0 15 10 15 * ?---------------在每个月的每15天的上午10:15触发
0 15 10 L * ?---------------在每个月的最后一天的上午10:15触发
0 15 10 ? * 6L---------------在每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6#3---------------在每个月的第三个星期五的上午10:15触发
0 0 12 1/5 * ?---------------从每月的第一天起每过5天的中午12:00时触发
0 11 11 11 11 ?---------------在每个11月11日的上午11:11时触发.
第五步配置总调度
方案二
方案二和方案一差不多,就是引用spring的api不太一样。方案二主要用来项目启动后,只执行一次。方案一用于项目启动后,定时执行多次。
第一步写一个业务类
和方案一一样。
第二步配置业务类
和方案一一样。
第三步配置定时任务目标对象和方法
initializerToken
第四步配置定时任务执行时间规则
SimpleTrigger
10000
60000
1
startDelay:延迟启动,单位是毫秒。如果不延迟,可以不配置,或者设置为0。
repeatInterval:重复执行的间隔时间,单位是毫秒。如果只执行一次,可以不配置。
repeatCount:重复执行次数,如果只执行一次,可以设置0,或者不配置。
endTime:结束时间。如果配置了repeatCount,则会按照repeatCount的配置来结束。如果没有配置repeatCount,则按照endTime配置的来结束。如果只执行一次,也就不用配置。
第五步配置总调度
本文档为【spring定时任务配置资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。