根据教程将redis的消息队列配置好。 消息队列 | ruoyi-vue-pro 开发指南 (iocoder.cn)
1、发送时需要填入短信日志编号,手机号,渠道编号,短信模板编号,短信模板参数
这是一个Java方法,名为
doSendSms,它接受一个SmsSendMessage类型的参数,并用于发送短信。首先,它从smsClientFactory中获取一个与指定渠道ID对应的SmsClient客户端。然后,它使用smsClient对象发送短信。最后,它将发送结果更新到smsLogService中。每次发送都会存储一条短信发送日志。
2、初始化渠道数据
@PostConstruct的解释:在Spring框架中,
@PostConstruct与@Autowired和@Inject一起使用,用于自动注入依赖项并在构造函数完成后执行初始化操作。当Spring容器创建一个类的实例并完成依赖注入后,它会检查是否有使用@PostConstruct注解的方法,如果有,Spring将自动调用这些方法。
@PostConstruct是一个Java注解,用于标记一个方法,该方法将在依赖注入完成后,但在类实例化之前被调用。这个注解通常用于执行一些初始化操作,如设置默认值、初始化数据结构或执行其他必要的配置。
第一步:查询短信渠道数据,实体对象为SmsChannelDo
第二步:将查询出的短信渠道对象转换为SmsChannelProperties对象并存入缓存中
3、获取渠道号对应的短信客户端
4、最终的短信发送操作
doSendSms一共有3个实现方法
阿里短信客户端
这里涉及到函数式编程参考:
Java函数式编程(一)–Function的使用_java function_boyn博言的博客-CSDN博客
简单来说就是将函数作为参数,然后在方法中使用xxx.apply调用这个函数apply内的参数就是传入函数的参数。
腾讯短信客户端
这里invoke的三个参数全是函数,this:doSendSms0是为了在lambda表达式中表示调用当前类的方法
requesSupplier方法用来创建请求参数
responseSupplier用来发送请求
resultGen用来处理响应
短信发送Service
总结:为了考虑多种短信客户端使用了抽象类接口的方式统一方法。使用redis作为消息队列的方式进行异步短信发送。每次的创建和发送短信都会更新日志表。