Commit 0d0110ec08af77841c737fc0fe13c5621c0a95c0

Authored by YunaiV
1 parent d843d6a5

云片、阿里云短信发送的调试完成

src/main/java/cn/iocoder/dashboard/framework/redis/config/RedisConfig.java
@@ -48,8 +48,8 @@ public class RedisConfig { @@ -48,8 +48,8 @@ public class RedisConfig {
48 * 创建 Redis Pub/Sub 广播消费的容器 48 * 创建 Redis Pub/Sub 广播消费的容器
49 */ 49 */
50 @Bean 50 @Bean
51 - public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory,  
52 - List<AbstractChannelMessageListener<?>> listeners) { 51 + public RedisMessageListenerContainer redisMessageListenerContainer(
  52 + RedisConnectionFactory factory, List<AbstractChannelMessageListener<?>> listeners) {
53 // 创建 RedisMessageListenerContainer 对象 53 // 创建 RedisMessageListenerContainer 对象
54 RedisMessageListenerContainer container = new RedisMessageListenerContainer(); 54 RedisMessageListenerContainer container = new RedisMessageListenerContainer();
55 // 设置 RedisConnection 工厂。 55 // 设置 RedisConnection 工厂。
@@ -69,8 +69,8 @@ public class RedisConfig { @@ -69,8 +69,8 @@ public class RedisConfig {
69 * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html 69 * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html
70 */ 70 */
71 @Bean(initMethod = "start", destroyMethod = "stop") 71 @Bean(initMethod = "start", destroyMethod = "stop")
72 - public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer(RedisTemplate<String, Object> redisTemplate,  
73 - List<AbstractStreamMessageListener<?>> listeners) { 72 + public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer(
  73 + RedisTemplate<String, Object> redisTemplate, List<AbstractStreamMessageListener<?>> listeners) {
74 // 第一步,创建 StreamMessageListenerContainer 容器 74 // 第一步,创建 StreamMessageListenerContainer 容器
75 // 创建 options 配置 75 // 创建 options 配置
76 StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions = 76 StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions =
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/SmsClientFactoryImpl.java
@@ -38,6 +38,7 @@ public class SmsClientFactoryImpl implements SmsClientFactory { @@ -38,6 +38,7 @@ public class SmsClientFactoryImpl implements SmsClientFactory {
38 AbstractSmsClient client = clients.get(properties.getId()); 38 AbstractSmsClient client = clients.get(properties.getId());
39 if (client == null) { 39 if (client == null) {
40 client = this.createSmsClient(properties); 40 client = this.createSmsClient(properties);
  41 + client.init();
41 clients.put(client.getId(), client); 42 clients.put(client.getId(), client);
42 } else { 43 } else {
43 client.refresh(properties); 44 client.refresh(properties);
src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java
@@ -16,7 +16,7 @@ import javax.annotation.Resource; @@ -16,7 +16,7 @@ import javax.annotation.Resource;
16 */ 16 */
17 @Component 17 @Component
18 @Slf4j 18 @Slf4j
19 -public class SmsSendConsumer extends AbstractStreamMessageListener<SysSmsSendMessage> { 19 +public class SysSmsSendConsumer extends AbstractStreamMessageListener<SysSmsSendMessage> {
20 20
21 @Resource 21 @Resource
22 private SysSmsService smsService; 22 private SysSmsService smsService;
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java
@@ -5,7 +5,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; @@ -5,7 +5,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
5 import java.util.Map; 5 import java.util.Map;
6 6
7 /** 7 /**
8 - * 短信日志服务接口 8 + * 短信日志 Service 实现类
9 * 9 *
10 * @author zzf 10 * @author zzf
11 * @date 13:48 2021/3/2 11 * @date 13:48 2021/3/2
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java
@@ -15,14 +15,14 @@ import java.util.Map; @@ -15,14 +15,14 @@ import java.util.Map;
15 import java.util.Objects; 15 import java.util.Objects;
16 16
17 /** 17 /**
18 - * 短信发送日志服务实现类 18 + * 短信日志 Service 实现类
19 * 19 *
20 * @author zzf 20 * @author zzf
21 * @date 2021/1/25 9:25 21 * @date 2021/1/25 9:25
22 */ 22 */
23 @Slf4j 23 @Slf4j
24 @Service 24 @Service
25 -public class SysSmsSendLogServiceImpl implements SysSmsLogService { 25 +public class SysSmsLogServiceImpl implements SysSmsLogService {
26 26
27 @Resource 27 @Resource
28 private SysSmsLogMapper smsLogMapper; 28 private SysSmsLogMapper smsLogMapper;
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java
@@ -12,7 +12,6 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; @@ -12,7 +12,6 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
13 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; 13 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
14 import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; 14 import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer;
15 -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;  
16 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; 15 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService;
17 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; 16 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService;
18 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; 17 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService;
@@ -42,8 +41,6 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @@ -42,8 +41,6 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
42 public class SysSmsServiceImpl implements SysSmsService { 41 public class SysSmsServiceImpl implements SysSmsService {
43 42
44 @Resource 43 @Resource
45 - private SysSmsChannelService smsChannelService;  
46 - @Resource  
47 private SysSmsTemplateService smsTemplateService; 44 private SysSmsTemplateService smsTemplateService;
48 @Resource 45 @Resource
49 private SysSmsLogService smsLogService; 46 private SysSmsLogService smsLogService;
@@ -145,7 +142,8 @@ public class SysSmsServiceImpl implements SysSmsService { @@ -145,7 +142,8 @@ public class SysSmsServiceImpl implements SysSmsService {
145 SmsCommonResult<SmsSendRespDTO> sendResult = smsClient.send(message.getLogId(), message.getMobile(), 142 SmsCommonResult<SmsSendRespDTO> sendResult = smsClient.send(message.getLogId(), message.getMobile(),
146 message.getApiTemplateId(), message.getTemplateParams()); 143 message.getApiTemplateId(), message.getTemplateParams());
147 smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), 144 smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(),
148 - sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), sendResult.getData().getSerialNo()); 145 + sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(),
  146 + sendResult.getData() != null ? sendResult.getData().getSerialNo() : null);
149 } 147 }
150 148
151 @Override 149 @Override
src/test-integration/java/cn/iocoder/dashboard/BaseDbAndRedisIntegrationTest.java 0 → 100644
  1 +package cn.iocoder.dashboard;
  2 +
  3 +import cn.iocoder.dashboard.framework.datasource.config.DataSourceConfiguration;
  4 +import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration;
  5 +import cn.iocoder.dashboard.framework.redis.config.RedisConfig;
  6 +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
  7 +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
  8 +import org.redisson.spring.starter.RedissonAutoConfiguration;
  9 +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  10 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  11 +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
  12 +import org.springframework.boot.test.context.SpringBootTest;
  13 +import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.ActiveProfiles;
  15 +
  16 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class)
  17 +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件
  18 +public class BaseDbAndRedisIntegrationTest {
  19 +
  20 + @Import({
  21 + // DB 配置类
  22 + DataSourceConfiguration.class, // 自己的 DB 配置类
  23 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  24 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
  25 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  26 + // MyBatis 配置类
  27 + MybatisConfiguration.class, // 自己的 MyBatis 配置类
  28 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  29 + // Redis 配置类
  30 + RedisAutoConfiguration.class, // Spring Redis 自动配置类
  31 + RedisConfig.class, // 自己的 Redis 配置类
  32 + RedissonAutoConfiguration.class, // Redisson 自动高配置类
  33 + })
  34 + public static class Application {
  35 + }
  36 +
  37 +}
src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java
@@ -4,7 +4,7 @@ import cn.hutool.core.thread.ThreadUtil; @@ -4,7 +4,7 @@ import cn.hutool.core.thread.ThreadUtil;
4 import cn.iocoder.dashboard.BaseRedisIntegrationTest; 4 import cn.iocoder.dashboard.BaseRedisIntegrationTest;
5 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; 5 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
6 import cn.iocoder.dashboard.modules.system.mq.consumer.mail.SysMailSendConsumer; 6 import cn.iocoder.dashboard.modules.system.mq.consumer.mail.SysMailSendConsumer;
7 -import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SmsSendConsumer; 7 +import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SysSmsSendConsumer;
8 import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage; 8 import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage;
9 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; 9 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
10 import org.junit.jupiter.api.Disabled; 10 import org.junit.jupiter.api.Disabled;
@@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit; @@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit;
18 18
19 public class RedisStreamTest { 19 public class RedisStreamTest {
20 20
21 - @Import({SmsSendConsumer.class, SysMailSendConsumer.class}) 21 + @Import({SysSmsSendConsumer.class, SysMailSendConsumer.class})
22 @Disabled 22 @Disabled
23 public static class ConsumerTest extends BaseRedisIntegrationTest { 23 public static class ConsumerTest extends BaseRedisIntegrationTest {
24 24
src/test-integration/java/cn/iocoder/dashboard/modules/system/service/package-info.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service;
src/test-integration/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceIntegrationTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.sms;
  2 +
  3 +import cn.hutool.core.map.MapUtil;
  4 +import cn.hutool.core.thread.ThreadUtil;
  5 +import cn.iocoder.dashboard.BaseDbAndRedisIntegrationTest;
  6 +import cn.iocoder.dashboard.common.enums.UserTypeEnum;
  7 +import cn.iocoder.dashboard.framework.sms.config.SmsConfiguration;
  8 +import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SysSmsSendConsumer;
  9 +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer;
  10 +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl;
  11 +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsLogServiceImpl;
  12 +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsServiceImpl;
  13 +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl;
  14 +import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
  15 +import org.junit.jupiter.api.Test;
  16 +import org.springframework.boot.test.mock.mockito.MockBean;
  17 +import org.springframework.context.annotation.Import;
  18 +
  19 +import javax.annotation.Resource;
  20 +import java.util.Map;
  21 +import java.util.concurrent.TimeUnit;
  22 +
  23 +@Import({SmsConfiguration.class,
  24 + SysSmsChannelServiceImpl.class, SysSmsServiceImpl.class, SysSmsTemplateServiceImpl.class, SysSmsLogServiceImpl.class,
  25 + SysSmsProducer.class, SysSmsSendConsumer.class})
  26 +public class SysSmsServiceIntegrationTest extends BaseDbAndRedisIntegrationTest {
  27 +
  28 + @Resource
  29 + private SysSmsServiceImpl smsService;
  30 + @Resource
  31 + private SysSmsChannelServiceImpl smsChannelService;
  32 +
  33 + @MockBean
  34 + private SysUserService userService;
  35 +
  36 + @Test
  37 + public void testSendSingleSms_云片发送成功() {
  38 + // 参数准备
  39 + String mobile = "15601691399";
  40 + Long userId = 1L;
  41 + Integer userType = UserTypeEnum.ADMIN.getValue();
  42 + String templateCode = "test_01";
  43 + Map<String, Object> templateParams = MapUtil.<String, Object>builder()
  44 + .put("operation", "登陆").put("code", "1234").build();
  45 + // 调用
  46 + smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
  47 +
  48 + // 等待 MQ 消费
  49 + ThreadUtil.sleep(1, TimeUnit.HOURS);
  50 + }
  51 +
  52 + @Test
  53 + public void testSendSingleSms_阿里云发送成功() {
  54 + // 参数准备
  55 + String mobile = "15601691399";
  56 + Long userId = 1L;
  57 + Integer userType = UserTypeEnum.ADMIN.getValue();
  58 + String templateCode = "test_02";
  59 + Map<String, Object> templateParams = MapUtil.<String, Object>builder()
  60 + .put("code", "1234").build();
  61 + // 调用
  62 + smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
  63 +
  64 + // 等待 MQ 消费
  65 + ThreadUtil.sleep(1, TimeUnit.HOURS);
  66 + }
  67 +
  68 +// @Test
  69 +// public void testDoSendSms() {
  70 +// // 等待 MQ 消费
  71 +// ThreadUtil.sleep(1, TimeUnit.HOURS);
  72 +// }
  73 +
  74 +}
src/test-integration/resources/application-integration-test.yaml
@@ -9,19 +9,15 @@ spring: @@ -9,19 +9,15 @@ spring:
9 # 数据源配置项 9 # 数据源配置项
10 datasource: 10 datasource:
11 name: ruoyi-vue-pro 11 name: ruoyi-vue-pro
12 - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写  
13 - driver-class-name: org.h2.Driver  
14 - username: sa  
15 - password:  
16 - schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具  
17 - druid:  
18 - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度  
19 - initial-size: 1 # 单元测试,配置为 1,提升启动速度 12 + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
  13 + driver-class-name: com.mysql.jdbc.Driver
  14 + username: root
  15 + password: 123456
20 16
21 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 17 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
22 redis: 18 redis:
23 host: 127.0.0.1 # 地址 19 host: 127.0.0.1 # 地址
24 - port: 6379 # 端口(单元测试,使用 16379 端口) 20 + port: 6379 # 端口
25 database: 0 # 数据库索引 21 database: 0 # 数据库索引
26 22
27 mybatis: 23 mybatis: