首页 > 其他分享 >rabbitMq实现系统内的短信发送设计&动态获取BEAN

rabbitMq实现系统内的短信发送设计&动态获取BEAN

时间:2024-06-06 19:55:51浏览次数:13  
标签:COMMENT 短信 DEFAULT TIMESTAMP rabbitMq 发送 BEAN NULL

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.走全流程等通过系统节点来触发,看是否符合预期结果。
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.父类  根据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

标签:COMMENT,短信,DEFAULT,TIMESTAMP,rabbitMq,发送,BEAN,NULL
From: https://www.cnblogs.com/oktokeep/p/18235917

相关文章

  • BeanDefinition的资源定位过程
    正文当我们传入一个Spring配置文件去实例化FileSystemXmlApplicationContext时,可以看一下它的构造方法都做了什么。/***下面这4个构造方法都调用了第5个构造方法*@paramconfigLocation*@throwsBeansException*///configLocation包含了BeanDefiniti......
  • Rabbitmq
    //connection//channel//broke//exchange:fanout、dirct、topic(*:一个单词、#:多个单词)、header//queue//bind(exchange,queue,routingkey)//一、如何保证消息不丢失//生产者发布消息时设置消息持久化(Persistent:true)、设置确认模式(DeliveryMode:2)//声明交换机时设......
  • RabbitMQ tutorial - "Hello world!"
    RabbitMQtutorial-"Helloworld!"本例阻塞线程方式一生产者一消费者依赖项abbitMQisinstalledrunningonlocalhostonthestandardport(5672).理解RabbitMQisamessagebroker:itacceptsandforwardsmessages.Youcanthinkaboutitasapostoffic......
  • Windows下载安装RabbitMQ客户端(2024最新篇)
    文章目录RabbitMQ认知RabbitMQ下载RabbitMQ安装更多相关内容可查看RabbitMQ认知定义:RabbitMQ是一个消息中间件,它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里。RabbitMQ与快递站......
  • 低代码智能通信:腾讯云短信助力,快速构建高效消息应用
    前言​ 随着信息技术的飞速发展,现代社会对信息传达的及时性、准确性与便捷性要求越来越高。尤其在移动互联网时代,用户对于服务的体验要求不断提升,这促使各类网站、APP、小程序等服务平台必须持续优化其交互方式,以满足用户日益增长的需求。​ 在此背景下,短信作为一种成熟、稳定且......
  • Vue前端实现接收rabbitMQ及时消息 原
    https://blog.csdn.net/dawnStart/article/details/110479833打开APPVue前端实现接收rabbitMQ及时消息原创2020-12-0214:03:11阅读量1.4wAI必读dawnStart码龄4年关注Vue前端实现实时接收rabbitMQ及时消息,看了别人写的不太详细1.rabbitMQ安装Stom插件2.Vu......
  • Sms-Activate是一个很好用的短信接码平台
    在海外有很多好用社交或者服务都需要注册才能使用,但是注册账号需要保证IP是特定的国家和相应国家的验证码,通常在国内就没法接收到验证码了,为了接受验证码我们需要找一个接码平台,而sms-activate就是一个非常好用的短信验证码接码平台,费用就在1.5人民币左右,通过它我们可以快速完成注......
  • Spring Boot自动装配bean到IOC容器的实现
    前言SpringBoot能帮助我们Java开发者快速开发基于Spring框架的应用,除了其作为依赖管理好帮手的一众Spring-Boot-Starter之外,其自动装配(AutoConfigure)特性也起到了非常重要的作用。那么SpringBoot是如何实现自动装配的呢?本文将结合源码去讲解其原理。版本信息spring-boot-......
  • CentOS-7.9 安装rabbitmq3.9.11 ,erlang-23.3.4.11
    下载所需rpm包wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.11/erlang-23.3.4.11-1.el7.x86_64.rpmwget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.11/rabbitmq-server-3.9.11-1.el7.noarch.rpm安装Erlangsu......
  • 企业短信公司
    在当今数字化时代,企业短信成为了企业营销中不可或缺的一环。随着移动互联网的普及和手机用户数量的不断增长,企业利用短信进行市场推广已经成为一种高效且直接的沟通方式。企业短信公司应运而生,为各行各业的企业提供专业的短信营销服务。作为企业短信公司,我们致力于帮助企业更......