java定时器定时发短信_quartz-job实现实时或定时发送短信任务(示例代码)
存放调度器(Job 和 Trigger)信息的xml配置文件:
这是某个指定的要实现的定时任务:
SendToManagerJob
com.xxx.cscns.sms.SendToManagerJob
SendToManagerJob
SendToManagerJob
0 30 8 * * ?
这是一个实时执行的任务服务,负责推送系统数据库短信信息表中的数据给运营商的接口完成发送短信操作:
ReceiveMessageJob
com.xxx.cscns.sms.ReceiveMessageJob
ReceiveMessageJob
ReceiveMessageJob
-1
1
上面配置的实时执行的意思就是间隔1毫秒执行无数次,由这个服务配合才能实现其他的任务服务,其他的任务就是完成插入指定的一些信息进入系统的数据表中,再由这个实时的推送服务第一时间推送给运营商接口完成发送操作,发送给指定的手机号;
所以发送短信必要要有合作的运营商的参数,ip,端口,账号和密码;
实时执行的任务服务job实现类:
packagecom.xxx.cscns.sms;importjava.util.Date;importjava.util.List;importorg.quartz.DisallowConcurrentExecution;importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;importorg.springframework.beans.factory.annotation.Autowired;importcom.xxx.cert.basic.certinfo.inter.ICertInfo;importcom.xxx.core.grammar.Record;importcom.xxx.core.utils.config.ConfigUtil;importcom.xxx.core.utils.container.ContainerFactory;importcom.xxx.core.utils.string.StringUtil;importcom.xxx.cscns.impl.SMSReceiveImpl;importcom.xxx.cscns.service.MessageService;importcom.xxx.cscns.utils.ConstValue;importcom.xxx.database.jdbc.connection.DataSourceConfig;importcom.xxx.frame.service.metadata.code.api.ICodeItemsService;importcom.xxx.frame.service.metadata.code.entity.CodeItems;importcom.esotericsoftware.minlog.Log;importcom.linkage.netmsg.NetMsgclient;importcom.linkage.netmsg.server.ReceiveMsg;/*** 短信接收服务
*@authorwmqiang
*@see[相关类/方法]
*@since[产品/模块版本]*/@DisallowConcurrentExecutionpublic class ReceiveMessageJob implementsJob {
// 封装的获取运营商的参数,ip,端口,账号和密码private static String ip = ConstValue.QXT_IP;
private static int port = Integer.parseInt(ConstValue.QXT_PORT);
private static String userName = ConstValue.QXT_USERNAME;
private static String pwd =ConstValue.QXT_PWD;//升级系统数据库连接配置信息
public static String sjUrl =ConstValue.sjUrl;public static String sjUsername =ConstValue.sjUsername;public static String sjPassword =ConstValue.sjPassword;
@Overridepublic void execute(JobExecutionContext arg0) throwsJobExecutionException {try{try{
System.out.println("------------进入短信发送服务-----------
");
MessageService messgeService= newMessageService();
MessageService sjmessgeService= newMessageService(sjUrl,sjUsername,sjPassword);
NetMsgclient client= newNetMsgclient();
ReceiveMsg receiveMsg= newSMSReceiveImpl();
client=client.initParameters(ip, port, userName, pwd, receiveMsg);/*登录认证*/
boolean isLogin =client.anthenMsg(client);
Log.info("------------receive " + isLogin + " loginsucess------------
");if(isLogin) {
String phone= "";
String content= "";
String rowguid= "";//获取分表表名,找到数据表就行,不用管
ICodeItemsService iCodeItemsService = ContainerFactory.getContainInfo().getComponent(ICodeItemsService.class);
List codeItemsList = iCodeItemsService.listCodeItemsByCodeName("短信分表");if(codeItemsList != null){for(CodeItems codeitem : codeItemsList){//分表表名
String tablename =codeitem.getItemText();// 调用方法找出系统数据表中没有发送的短信
List listInfo =messgeService.getSendMessage(tablename);for(Record info : listInfo) {
phone= info.get("MessageTarget");
content= info.get("Content");
rowguid= info.get("MessageItemGuid");if (StringUtil.isNotBlank(content) &&StringUtil.isNotBlank(phone)) {
System.out.println(new Date() + "【xxx项目】短信发送服务已发送短信:" + phone + " 内容:" + content + "
");
client.sendMsg(client,0, phone, content, 1);
messgeService.updateMessageCenterByRowguid(rowguid,tablename);
}
}//升级项目短信发送
List SJlistInfo =sjmessgeService.getSendMessage(tablename);for(Record info : SJlistInfo) {
phone= info.get("MessageTarget");
content= info.get("Content");
rowguid= info.get("MessageItemGuid");if (StringUtil.isNotBlank(content) &&StringUtil.isNotBlank(phone)) {
client.sendMsg(client,0, phone, content, 1);
sjmessgeService.updateMessageCenterByRowguid(rowguid,tablename);
System.out.println(new Date() + "【升级项目】短信发送服务已发送短信:" + phone + " 内容:" + content + "
");
}
}
}
}
client.closeConn();
Thread.sleep(5000);
}
}catch(Exception e1) {
e1.printStackTrace();
}finally{
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
其中// 封装的获取运营商的参数,ip,端口,账号和密码,在一个配置文件中配置参数,
// 调用方法找出系统数据表中没有发送的短信messgeService.getSendMessage(tablename):
public classMessageService {/*** 找出未发送短信
*@return*@exception/throws [违例类型] [违例说明]
*@see[类、类#方法、类#成员]*/
public ListgetSendMessage(String tablename) {
List list = new ArrayList<>();//获取到短信表中需要发送短信的信息即可/*String strSql = "SELECT * FROM Messages_Center WHERE SendMode=1 and ((IsSchedule=1 and ScheduleSendDate< NOW() ) or ( IsSchedule=0) ) ";*/String strSql= "SELECT * FROM "+tablename+" WHERE SendMode=1 and ((IsSchedule=1 and ScheduleSendDate< NOW() )"
+ " or ( IsSchedule=0) ) "
+ " and GENERATEDATE >= (select date_sub(now(), interval 2 hour)) ";try{
list= dao.findList(strSql, Record.class);
}catch(Exception e) {
e.printStackTrace();
}finally{if (dao != null){
dao.close();
}
}returnlist;
}
}
以上后台代码就是实现了实时发送短信的任务;
接下来有需要发送特定短信内容的业务场景中,只要往存储短信的这张数据表中插数据即可;
有需要发送特定短信内容的定时任务实现,也就是配置特定的调度完成往存储短信的这张数据表中插数据操作就行;
如上面的那个配置
每天给项目经理发送短信避免短信服务挂了 定时每天08:30执行
实例后台代码:
根据配置的调度信息,找到job的实现类和其业务逻辑实施层方法,如下实例:
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();
}
}
}
其中最后的业务逻辑实施层的方法中,就是完成了定时往特定的存储短信内容的数据表中,插入相应的数据的操作;
java定时器定时发短信_quartz-job实现实时或定时发送短信任务(示例代码)相关推荐
- 微信小程序云开发,使用阿里云短信服务,搜索员工生日定期发送短信。
相关API文档地址: 阿里云短信服务API文档地址 小程序云开发云函数正则匹配API文档地址 小程序云开发云函数定时触发器 1.登录阿里云,购买短信服务并添加签名和模板 2., 登录阿里云,鼠标放在右 ...
- Android实现拨打电话和发送短信,Android手机拨打电话、手动发送短信与自动拨打电话、自动发送短信(代码很简单哦)...
Android实现手动拨打电话,即点击后跳转到手机默认电话号码输入页面,可以将相应号码传送过去: Intent intent = new Intent(Intent.ACTION_DIAL, Uri. ...
- python微信定时发消息_python实现给微信指定好友定时发送消息
微信如何在设定时间自动发送信息给指定好友 微信没有定时发送信息的功能,但是可以借助小程序. 世界上最遥远的距离,不是生与死,而是小编就站在你面前,你却不知道小编爱你. 打开微信之后在搜索小程序中输入蜗 ...
- 企业微信机器人脚本python_python实现企业微信定时发送文本消息的示例代码
企业微信定时发送文本消息 使用工具:企业微信机器人+python可执行文件+计算机管理中的任务计划程序 第一步:创建群机器人 选择群聊,单击鼠标右键,添加群机器人. 建立群机器人后,右键查看机器人,如 ...
- php 发短信的类,[php封装类]PHP封装发送短信类!
/** * 手机短信发送 * 需要开启 Crul * 分钟配额为:1000 次/分钟 . 超过分钟配额服务禁用. * 向同一手机号发送短信, 最小时间间隔为15 秒. * 一次最多都只能发65个汉字( ...
- qpython3h手机版怎么发短信_python如何使用腾讯云发送短信
腾讯云方面的申请和流程都比较简单,基本都是可视化操作的,这里就不在赘述了.这篇文章着重讲解怎么用python实现调用. 我假设你已经满足了以下几个前提 + 已经开通了腾讯云短信业务 + 创建好了短信签 ...
- python发短信验证码_python利用第三方模块,发送短信验证码
对于初学者,如何利用第三方python开发包发送短信验证码,下面是具体的实现和记录过程! 环境:虚拟机上centos7平台,python3.7版本: 首先,申请账号的部分就省略了 1. 获得appid ...
- 小米手机 java 代码无法连接短信_小米手机无法接受和发送短信,为什么?
展开全部 可能是以下32313133353236313431303231363533e4b893e5b19e31333363396462的几个原因: 1.手机短信存储已满 在不断地接收短信的过程中, ...
- 【阿里云短信服务SMS】使用阿里云发送短信
使用阿里云发送短信 前期准备工作 1.添加签名 2.添加短信模板 3.创建子用户,得到密钥:AccessKeyId和 AccessKeySecret 4.给子用户添加权限 5.收集好之前步骤中的4个关 ...
- linux 4g模块发送短信,OpenWRT使用4G模块上网和发送短信
1.配置ppp 配置参考:https://blog.csdn.net/qianguozheng/article/details/50543704 结果就是:lsusb能发现HUAWEI的4G模块,if ...
最新文章
- python3 zipfile_python3中zipfile模块的常用方法
- 算法------------ 最长公共前缀
- 有效处理 Java 异常三原则
- 程序员面试金典 - 面试题 16.06. 最小差(排序+双指针)
- ASP.NET AJAX深入浅出系列课程(10):基于Microsoft AJAX Library扩展客户端组件.zip(10.77 MB)...
- HTTP缓存(HTTP Cacheing):缓存控制(Cache-Control)
- 注意判断js中使用正则表达式的转义字符,到底是对谁进行转义!!!
- 面向对象——面向客户端编程
- Atitit 数据库view视图使用推荐规范与最佳实践与方法
- (ensp)华为USG6000v防火墙双机热备份的配置
- 还原扩容的缩水U盘真实容量方法,让数据免受损失
- 苹果M1芯片为何如此快?
- 计算机键盘无法使用6,电脑左边键盘数字键只可以用5和6,怎么回事
- 苹果可以访问linux的smb,Samba For iOS让iPhone使用网上邻居使用体验教程
- 利用c/c++打造烟花表白程序,撩妹一撩一个准!
- 【工具分享】如何识别手机里偷数据的那些软件(适用于安卓平台)
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)...
- border每个边框的阴影(box-shadow属性)
- 读《九败一胜—美团创始人王兴创业十年》有感
- js实现城市首字母导航
热门文章
- 微信公众号订阅号开发的学习(一):基础知识
- uniapp的button按钮使用boder:none依然无法去掉黑色边框的解决。
- 计算机类综述论文范文,综述的写法(计算机类论文综述的写法)
- 独立站运营到底要做什么!
- 家庭收支记账软件项目【Golang-面向过程】
- Mysql 临时表详解(temporary table)
- 如何让自己的电脑内外网同时用?
- 基于深度学习的自然场景文字识别系统研究 faster-RCNN + CRNN (二)
- java识别图片文字_java 实现图片的文字识别
- win的反义词_初中阶段常用的133个英语单词反义词!