使用quartz开源调度框架,写服务实现在一些指定场景发送特定短信,创建一个实现org.quartz.Job接口的java类。Job接口包含唯一的方法:
public void execute(JobExecutionContext context) throws JobExecutionException;
在你的Job接口实现类里面,添加一些逻辑到
execute()方法。一旦你配置好Job实现类并设定好调度时间表,Quartz将密切注意剩余时间。当调度程序确定该是通知你的作业的时候,
Quartz框架将调用你Job实现类(作业类)上的
execute()方法并允许做它该做的事情。无需报告任何东西给调度器或调用任何特定的东西。仅仅
执行任务和结束任务即可。如果配置你的作业在随后再次被调用,Quartz框架将
在恰当的时间再次调用它;
存放调度器(Job 和 Trigger)信息的xml配置文件中:
<!-- 每天给项目经理发送短信避免短信服务挂了 定时每天08:30执行--> <job> <name>SendToManagerJob</name> <job-class>com.xxx.cscns.sms.SendToManagerJob</job-class> </job> <trigger> <cron> <name>SendToManagerJob</name> <job-name>SendToManagerJob</job-name> <cron-expression>0 30 8 * * ?</cron-expression> </cron> </trigger>
其中<cron-expression>标签的值表示执行的时间和频率信息,有一套完整的格式规范:
序号 说明 是否必填 允许填写的值 允许的通配符
1 秒 是 0-59 , - * /
2 分 是 0-59 , - * /
3 小时 是 0-23 , - * /
4 日 是 1-31 , - * ? / L W
5 月 是 1-12 or JAN-DEC , - * /
6 周 是 1-7 or SUN-SAT , - * ? / L #
7 年 否 empty 或 1970-2099 , - * /
上面短信发送任务的 0 30 8 * * ? 表示“每天早上八点半执行一次”的意思;
其中通配符说明:* 表示所有值,例如:在分的字段上设置 "*",表示每一分钟都会触发;
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" ;
- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发 ;
/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在日字段上设置'1/3'所示每月1号开始,每隔三天触发一次 ;
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT",
如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五",因为7是星期六,1是星期日;
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发;
'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发;
job实现类的代码:
package com.xxx.cscns.sms; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import com.xxx.core.xxxFrameDsManager; import com.xxx.cscns.service.MessageService; @DisallowConcurrentExecution public class SendToManagerJob implements Job{ @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { try { xxxFrameDsManager.begin(null); MessageService messageService = new MessageService(); // 调用业务逻辑实施层方法,实现发短信操作 messageService.sendToManger(); System.out.println("上班前半小时发送一次短信给项目经理成功!"); } catch (Exception e) { xxxFrameDsManager.rollback(); e.printStackTrace(); System.out.println("上班前半小时发送一次短信给项目经理异常:"+e.toString()); } finally { xxxFrameDsManager.close(); } } }
封装的业务逻辑实施层的方法:
/* * * 每天给项目经理发送短信避免短信服务挂了 */ public void sendToManger() { try { //系统参数配置项目经理手机号码,这儿是封装的方法,只要能获取到项目经理手机号就行 String messageTarget = new FrameConfigService9().getFrameConfigValue("ASP_MESSAGE_TEST_TEL"); //时间格式化 SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String sql = "insert into Messages_center ( MessageItemGuid, Content, GenerateDate, IsSchedule, MessageTarget, sendMode,messagetype)"; sql += "values( '" + UUID.randomUUID().toString() + "', '【XXX项目】短信服务正常。', to_date('" + sdf2.format(new Date())+ "', 'yyyy-mm-dd hh24:mi:ss'), 0, '" + messageTarget + "', 1,'短信')"; if(StringUtil.isNotBlank(messageTarget)){ dao.execute(sql); } } catch (Exception e) { e.printStackTrace(); dao.rollBackTransaction(); } finally { if (dao != null){ dao.close(); } } }