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的更多相关文章

  1. PhpSms 稳定可靠的php短信发送库

    可能是目前最聪明.优雅的PHP短信发送库了.从此不再为各种原因造成的个别短信发送失败而烦忧! phpsms的任务均衡调度功能由toplan/task-balancer提供. GitHub地址:http ...

  2. C#利用Web Service实现短信发送(转)

    通过编程方式实现短信息的发送对很多人来说是一件比较烦杂的事情,目前一般的解决方法是通过计算机和手机的连线,通过可对手机编程的语言编写相关的手机短信息程序来实现,而这种方法对于一般人来说是很难达到的,因 ...

  3. C# 编写短信发送Window服务

    我们做项目过程中,一般都会有发送短信的需求.最常见的就是户注册或者登录时发送短信验证码.不同类型的短信发送,我们都可以放到到一张短信表中,然后通过一个定时的作业去执行短信发送.而定时作业的执行,我们就 ...

  4. Android短彩信源码解析-短信发送流程(二)

    转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...

  5. 2018阿里云短信发送DEMO接入简单实例

    以下更新2018-04-2309:57:54 后续不再更新, 基本类: app/SignatureHelper.php <?php namespace aliyun_mns; /** * 签名助 ...

  6. 043 用户注册功能03--Redis安装及完成短信发送功能

    1.Redis安装 (1)下载地址:https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100   ( redis官网: ht ...

  7. PHP 手机短信发送验证码

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5645xiw 欢迎大家加入,一起讨论学习 本篇设计的知识点有点多,我会分类将,同学们可 ...

  8. [工具开发] 一信通 Web 短信发送客户端

    一.简介 为了协助公司运营部对几家短信平台进行测试,我根据各自的接口文档编写了几个简单的短信发送客户端: 下面是一信通 Web 短信发送客户端,使用 HTTP GET 方法. 二.效果图 1. 首页 ...

  9. Android短彩信源码解析-短信发送流程(三)

    3.短信pdu的压缩与封装 相关文章: ------------------------------------------------------------- 1.短信发送上层逻辑 2.短信发送f ...

  10. 使用飞信api接口实现短信发送(只能发送好友)

    找了很久才找到一个能用的飞信API接口(http://quanapi.sinaapp.com/fetion.php?u=飞信登录手机号&p=飞信登录密码&to=接收飞信的手机号& ...

随机推荐

  1. 使用云效Codeup10分钟紧急修复Apache Log4j2漏洞

    ​简介:2021年12月10日,国家信息安全漏洞共享平台(CNVD)收录了Apache Log4j2远程代码执行漏洞(CNVD-2021-95914),此漏洞是一个基于Java的日志记录工具,为Log ...

  2. 从操作系统层面分析Java IO演进之路

    简介: 本文从操作系统实际调用角度(以CentOS Linux release 7.5操作系统为示例),力求追根溯源看IO的每一步操作到底发生了什么. 作者 | 道坚来源 | 阿里技术公众号 前言 本 ...

  3. MaxCompute非事务表如何更新数据

    简介: 本文主要讲解如何通过insert overwrite更新数据 背景 对于大数据中的大多数存储格式,支持随机更新非常复杂.它需要扫描大型文件,MaxCompute推出了最新的功能Transact ...

  4. 阿里云CDN操控2.0版本正式发布

    ​简介: 2021年8月,阿里云边缘云CDN完成过去3年来最大的一次版本升级. 2021年8月,阿里云边缘云CDN完成过去3年来最大的一次版本升级.本次升级根据上万企业客户的使用反馈和行业应用特征,从 ...

  5. Serverless Devs 2.0 全新发布,让 Serverless 应用开发更简单

    ​简介: 2020 年 10 月 23日,阿里巴巴正式宣布开源其首个 Serverless 开发者平台 Serverless Devs.历经近一年精心打磨,今天 Serverless Devs 2.0 ...

  6. VisualStudio 禁用移动文件到文件夹自动修改命名空间功能

    在 VisualStudio 2022 里的某个版本开始,将会在移动文件到其他文件夹时,自动修改命名空间,使用匹配文件夹路径的命名空间.如果这个功能能顺手将其他引用此类型的全部符号同时变更,那自然是很 ...

  7. 第3讲-Cadence分裂元件的制作方法

    笔记3-Cadence分裂元件的制作方法 1.Homogeneous和heterogeneous的区别: 2.创建homogeneous类型元件: 3.创建heterogeneous类型元件. 把元件 ...

  8. Mybatis学习三(动态sql语句)

    动态sql语句主要为以下语句 1.动态SQL:if 语句2.动态SQL:if+where 语句3.动态SQL:if+set 语句4.动态SQL:choose(when,otherwise) 语句5.动 ...

  9. 联想G470安装黑苹果

    macos10136 黑苹果usb无线网卡 1.系统下载: 下面是我自制的带clover 4596版本的u盘镜像: 链接: https://pan.baidu.com/s/1wRdVddwkei7bf ...

  10. PostgreSQL世界上最先进的开源关系型数据库

    PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库". PostgreSQL是一个功能非常强大.源代码开放的对象关系数据库系统(ORDBMS),在灵活的B ...