rabbitMq实现系统内的短信发送设计&动态获取BEAN
rabbitMq实现系统内的短信发送设计&动态获取BEAN
1.短信非系统的重要节点操作,可以在任务完成之后,比如下单成功,发送下单成功的mq消息,短信服务接收到mq消息,
动态的判断该短信的code,通过全局公共的父类(调用中台等接口获取全部所有需要的对象参数),获取短信中的{mobile}等参数来替换短信模板中的可变量。
这样系统中的所有的发送短信,都可以继承该父类,获取参数,从而实现方便快捷的扩展短信接入和对原来的短信模板内容的修改或新增短信中的可变量。
2.短信服务封装好短信的code和短信中的需要的参数,然后解析出来文本,将mobile和content等重要参数,调用第三方的短信供应商接口来发送短信。
3.系统中的短信模板表设计如下:
CREATE TABLE `tbl_sms_template` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`text_code` VARCHAR(80) NOT NULL COMMENT '唯一标识',
`content` VARCHAR(1000) NOT NULL COMMENT '短信消息内容,动态参数以{开头,}结尾',
`send_source_srv` VARCHAR(30) DEFAULT NULL COMMENT '发送方服务来源',
`send_source_biz` VARCHAR(30) DEFAULT NULL COMMENT '发送方业务来源',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_op` VARCHAR(50) DEFAULT NULL COMMENT '创建人',
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_delete` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '删除标记 0未删除 1已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `text_code` (`text_code`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短信模板表' CREATE TABLE `tbl_sms_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID主键',
`mobile` BIGINT(20) DEFAULT NULL COMMENT '手机号',
`content` TEXT COMMENT '短信内容',
`type` INT(1) DEFAULT NULL COMMENT '分类',
`remark` VARCHAR(100) DEFAULT NULL COMMENT '备注',
`req_ip` VARCHAR(60) DEFAULT NULL COMMENT '请求IP',
`req_beg_time` TIMESTAMP NULL DEFAULT NULL COMMENT '请求时间',
`req_beg_back_time` TIMESTAMP NULL DEFAULT NULL COMMENT '请求返回时间',
`req_status` INT(1) DEFAULT NULL COMMENT '发送结果(1:成功2:失败)',
`res` VARCHAR(150) DEFAULT NULL COMMENT '短信返回结果',
`supplier` INT(1) DEFAULT '1' COMMENT '短信平台服务供应商',
`send_source_srv` VARCHAR(30) DEFAULT NULL COMMENT '发送方服务来源',
`send_source_biz` VARCHAR(30) DEFAULT NULL COMMENT '发送方业务来源',
`account_type` INT(1) DEFAULT NULL COMMENT '短信账户通道类型',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_op` VARCHAR(50) DEFAULT NULL COMMENT '创建人',
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_delete` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '删除标记 0未删除 1已删除',
PRIMARY KEY (`id`),
KEY `create_time` (`create_time`),
KEY `mobile` (`mobile`,`req_status`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='短信发送日志表'
4.测试短信的方法:
4.1.走全流程等通过系统节点/接口/App/XxlJob调度任务来触发,看是否符合预期结果。
4.2.可以通过rabbitMq管理后台,找到队列名称,直接将json字符串通过队列来发送,检查短信服务是否正常接收且短信是否正常发送。
4.3.可以通过rabbitMq管理后台,找到交换机exchange名称,直接将json字符串通过交换机exchange和路由key来发送,检查短信服务是否正常接收且短信是否正常发送。
5.具体实现,伪代码
发送端
//取消订单
CANCEL_ORDER_EVENT("sys-order-action","action.cancel.order.key","取消订单事件"), //发送MQ 只需要一个订单号。orderNo可以封装到一个对象中。
//发送端不关心具体的短信可变量参数,减少耦合代码。
baseProducer.sendTopicMessage(CANCEL_ORDER_EVENT.exchange, CANCEL_ORDER_EVENT.routingKey, orderNo);
接收端实现类
配置路由key和实现类的枚举类
CANCEL_ORDER_EVENT("action.cancel.order.key", "CancelOrderService"), //取消订单事件 配置短信模板:
//发送短信给售货商
CANCEL_ORDER_TO_OWNER("CancelOrderToOwner", "您的订单(订单号:$orderNo$),订单金额($orderAmt$),请在($orderAddress$)配送地址,已取消,快去APP看看吧!")
//发送短信给买货方
CANCEL_ORDER_TO_BUYER("CancelOrderToBuyer", "您的订单(订单号:$orderNo$),订单金额($orderAmt$),请在($orderAddress$)配送地址,已取消,快去APP看看吧!") @RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "order_sms_queuetest", durable = "true"),
exchange = @Exchange(value = "sys-order-action", durable = "true", type = "topic"), key = "action.#")
}, containerFactory = "orderRabbitListenerContainerFactory")
public void process(Message message) {
log.info("receive order action message: " + new String(message.getBody()));
try {
//构建短信发送对象
SmsMessage smsMessage = createSmsMessageService(message);
if (Objects.nonNull(smsMessage)) {
//发送短信
sendSMSMessageData(smsMessage);
}
} catch (Exception e) {
log.info("订单短信发送异常,msg:[{}]", e);
} public SmsMessage createSmsMessageService(Message message){
//1.获取路由key
String routeKeyName = message.getMessageProperties().getReceivedRoutingKey(); //2.根据路由key 找到 实现类的service名称 (配置路由key和实现类的枚举类)
String serviceName = getSmsServiceTemplate(routeKeyName);
if(StringUtils.isBlank(serviceName))
{
log.info("该事件没有需要发送得短信,routeKeyName:[{}]",routeKeyName);
return null;
} //3.首字母小写
serviceName = serviceName.substring(0, 1).toLowerCase() + serviceName.substring(1);
log.info("该事件获取的smsMessage service为:[{}]",serviceName); //4.父类 根据serviceName名称,调用getBean方式获取父类,方法中具体逻辑由实现子类来实现。 //5.调用实现子类获取短信发送的对象(短信参数)
return smsMessage;
}
//动态获取BEAN 参考:
Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法
https://www.cnblogs.com/oktokeep/p/18235912
@Service
public class OrderSmsService implements ApplicationContextAware { private ApplicationContext applicationContext; @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
} public <T> T getBean(String beanName) {
if (applicationContext.containsBean(beanName)) {
return (T) applicationContext.getBean(beanName);
} else {
return null;
}
} }
扩展:
基础底层短信服务的设计思路
https://www.cnblogs.com/oktokeep/p/17663970.html
rabbitMq实现系统内的短信发送设计&动态获取BEAN的更多相关文章
- PhpSms 稳定可靠的php短信发送库
可能是目前最聪明.优雅的PHP短信发送库了.从此不再为各种原因造成的个别短信发送失败而烦忧! phpsms的任务均衡调度功能由toplan/task-balancer提供. GitHub地址:http ...
- C#利用Web Service实现短信发送(转)
通过编程方式实现短信息的发送对很多人来说是一件比较烦杂的事情,目前一般的解决方法是通过计算机和手机的连线,通过可对手机编程的语言编写相关的手机短信息程序来实现,而这种方法对于一般人来说是很难达到的,因 ...
- C# 编写短信发送Window服务
我们做项目过程中,一般都会有发送短信的需求.最常见的就是户注册或者登录时发送短信验证码.不同类型的短信发送,我们都可以放到到一张短信表中,然后通过一个定时的作业去执行短信发送.而定时作业的执行,我们就 ...
- Android短彩信源码解析-短信发送流程(二)
转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...
- 2018阿里云短信发送DEMO接入简单实例
以下更新2018-04-2309:57:54 后续不再更新, 基本类: app/SignatureHelper.php <?php namespace aliyun_mns; /** * 签名助 ...
- 043 用户注册功能03--Redis安装及完成短信发送功能
1.Redis安装 (1)下载地址:https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100 ( redis官网: ht ...
- PHP 手机短信发送验证码
点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5645xiw 欢迎大家加入,一起讨论学习 本篇设计的知识点有点多,我会分类将,同学们可 ...
- [工具开发] 一信通 Web 短信发送客户端
一.简介 为了协助公司运营部对几家短信平台进行测试,我根据各自的接口文档编写了几个简单的短信发送客户端: 下面是一信通 Web 短信发送客户端,使用 HTTP GET 方法. 二.效果图 1. 首页 ...
- Android短彩信源码解析-短信发送流程(三)
3.短信pdu的压缩与封装 相关文章: ------------------------------------------------------------- 1.短信发送上层逻辑 2.短信发送f ...
- 使用飞信api接口实现短信发送(只能发送好友)
找了很久才找到一个能用的飞信API接口(http://quanapi.sinaapp.com/fetion.php?u=飞信登录手机号&p=飞信登录密码&to=接收飞信的手机号& ...
随机推荐
- Datastream 开发打包问题
简介:Datastream作业开发时往往会遇到一些jar包冲突等问题,本文主要讲解作业开发时需要引入哪些依赖以及哪些需要被打包进作业的jar中,从而避免不必要的依赖被打入了作业jar中以及可能产生的 ...
- 双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%
简介:在规划中,Quick BI制定了产品竞争力建设的三大方向,包括Quick(快)能力.移动端能力和集成能力.针对其中的产品"报表查看打开慢""报表开发数据同步慢&q ...
- 慢SQL治理分享
简介: 这里的慢SQL指的是MySQL慢查询,是运行时间超过long_query_time值的SQL.真实的慢SQL通常会伴随着大量的行扫描.临时文件排序或者频繁的磁盘flush,直接影响就是磁盘IO ...
- [FAQ] VsCode 同时多行编辑
[多光标自定义编辑] 按住 alt 键,鼠标左键点击,出现多个光标. [批量选中匹配编辑] 鼠标选中字符,按快捷键 ctrl + shift + L,字符的右侧都出现光标,可同时编辑. Tool: ...
- XAML 给资源起个好名字 用 StaticResource 起一个别名
本文来和大家聊一下关于 XAML 资源的定义的事情,和开发技术关系不大,更多的是开发的思路 在稍微大一点的项目里,肯定 XAML 资源是少不了的.对于 XAML 资源,行业里讨论多(非小白讨论)的是关 ...
- 2019-8-31-C#-转换类型和字符串
title author date CreateTime categories C# 转换类型和字符串 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17:2 ...
- 使用 NestJS 和 qrcode.js 创建 QR 码生成器 API
前言 QR码(Quick Response Code)是一种二维码,于1994年开发.它能快速存储和识别数据,包含黑白方块图案,常用于扫描获取信息.QR码具有高容错性和快速读取的优点,广泛应用于广告. ...
- Oracle和达梦:查询系统表、系统表字段
1.查询系统表 当前模式下所有的表 可以查询到:表名.表注释 select * from user_tab_comments where TABLE_TYPE = 'TABLE' 2.查询系统表字段 ...
- 08 ES基本的聚合查询
目录 按protocol聚合 指定地区,按port聚合 指定地区和时间段,按ip聚合(独立ip 即ip去重) 并且 聚合再求独立ip数 聚合后将聚合结果进行分页的解决办法 子聚合 按protocol聚 ...
- 支持4K60帧,高清高帧率远程控制软件
设计师可以在家远程工作吗?动画制作人员可以远程在家工作吗?视频后期人员可以远程在家工作吗? 相比其他领域,设计.动画.影视视频后期等行业,往往需要高端机运行大型专业软件,一般人家里不具备这个办公条件. ...