实现短信通过redis stream异步发送,实现短信callback处理
parent
767cd90279
commit
225664550f
@ -1,15 +1,15 @@
|
|||||||
//package cn.iocoder.dashboard;
|
package cn.iocoder.dashboard;
|
||||||
//
|
|
||||||
//import de.codecentric.boot.admin.server.config.EnableAdminServer;
|
import de.codecentric.boot.admin.server.config.EnableAdminServer;
|
||||||
//import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
//import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
//
|
|
||||||
//@SpringBootApplication
|
@SpringBootApplication
|
||||||
//@EnableAdminServer
|
@EnableAdminServer
|
||||||
//public class DashboardApplication {
|
public class DashboardApplication {
|
||||||
//
|
|
||||||
// public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// SpringApplication.run(DashboardApplication.class, args);
|
SpringApplication.run(DashboardApplication.class, args);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
//}
|
}
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
package cn.iocoder.dashboard.framework.sms.client;
|
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
|
|
||||||
|
|
||||||
import javax.servlet.ServletRequest;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 需要发送请求获取短信发送结果的短信客户端
|
|
||||||
*
|
|
||||||
* @author zzf
|
|
||||||
* @date 2021/3/4 17:20
|
|
||||||
*/
|
|
||||||
public interface HadCallbackSmsClient {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取短信发送结果
|
|
||||||
*
|
|
||||||
* @param request 请求
|
|
||||||
* @return 短信发送结果
|
|
||||||
*/
|
|
||||||
List<SmsResultDetail> getSmsSendResult(ServletRequest request) throws Exception;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
package cn.iocoder.dashboard.framework.sms.client;
|
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
|
|
||||||
import com.aliyuncs.exceptions.ClientException;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 需要发送请求获取短信发送结果的短信客户端
|
|
||||||
*
|
|
||||||
* @author zzf
|
|
||||||
* @date 2021/3/4 17:20
|
|
||||||
*/
|
|
||||||
public interface NeedQuerySendResultSmsClient {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取短信发送结果
|
|
||||||
*
|
|
||||||
* @param param 参数
|
|
||||||
* @return 短信发送结果
|
|
||||||
*/
|
|
||||||
List<SmsResultDetail> getSmsSendResult(String param) throws Exception;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -0,0 +1,212 @@
|
|||||||
|
package cn.iocoder.dashboard.framework.sms.client.impl.ali;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsResult;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty;
|
||||||
|
import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
|
||||||
|
import cn.iocoder.dashboard.util.json.JsonUtils;
|
||||||
|
import com.aliyuncs.DefaultAcsClient;
|
||||||
|
import com.aliyuncs.IAcsClient;
|
||||||
|
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
|
||||||
|
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
|
||||||
|
import com.aliyuncs.http.MethodType;
|
||||||
|
import com.aliyuncs.profile.DefaultProfile;
|
||||||
|
import com.aliyuncs.profile.IClientProfile;
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阿里短信实现类
|
||||||
|
*
|
||||||
|
* @author zzf
|
||||||
|
* @date 2021/1/25 14:17
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class AliyunSmsClient extends AbstractSmsClient {
|
||||||
|
|
||||||
|
private static final String OK = "OK";
|
||||||
|
|
||||||
|
private static final String PRODUCT = "Dystopi";
|
||||||
|
|
||||||
|
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
|
||||||
|
|
||||||
|
private static final String ENDPOINT = "cn-hangzhou";
|
||||||
|
|
||||||
|
private final IAcsClient acsClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造阿里云短信发送处理
|
||||||
|
*
|
||||||
|
* @param channelVO 阿里云短信配置
|
||||||
|
*/
|
||||||
|
public AliyunSmsClient(SmsChannelProperty channelVO) {
|
||||||
|
super(channelVO);
|
||||||
|
|
||||||
|
String accessKeyId = channelVO.getApiKey();
|
||||||
|
String accessKeySecret = channelVO.getApiSecret();
|
||||||
|
|
||||||
|
IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, accessKeyId, accessKeySecret);
|
||||||
|
DefaultProfile.addEndpoint(ENDPOINT, PRODUCT, DOMAIN);
|
||||||
|
|
||||||
|
acsClient = new DefaultAcsClient(profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SmsResult doSend(String templateApiId, SmsBody smsBody, String targetPhone) throws Exception {
|
||||||
|
SendSmsRequest request = new SendSmsRequest();
|
||||||
|
request.setSysMethod(MethodType.POST);
|
||||||
|
request.setPhoneNumbers(targetPhone);
|
||||||
|
request.setSignName(channelVO.getApiSignatureId());
|
||||||
|
request.setTemplateCode(templateApiId);
|
||||||
|
request.setTemplateParam(smsBody.getParamsStr());
|
||||||
|
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
|
||||||
|
|
||||||
|
boolean success = OK.equals(sendSmsResponse.getCode());
|
||||||
|
if (!success) {
|
||||||
|
log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage());
|
||||||
|
}
|
||||||
|
return new SmsResult()
|
||||||
|
.setSuccess(success)
|
||||||
|
.setMessage(sendSmsResponse.getMessage())
|
||||||
|
.setCode(sendSmsResponse.getCode())
|
||||||
|
.setApiId(sendSmsResponse.getBizId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [{
|
||||||
|
* "send_time" : "2017-08-30 00:00:00",
|
||||||
|
* "report_time" : "2017-08-30 00:00:00",
|
||||||
|
* "success" : true,
|
||||||
|
* "err_msg" : "用户接收成功",
|
||||||
|
* "err_code" : "DELIVERED",
|
||||||
|
* "phone_number" : "18612345678",
|
||||||
|
* "sms_size" : "1",
|
||||||
|
* "biz_id" : "932702304080415357^0",
|
||||||
|
* "out_id" : "1184585343"
|
||||||
|
* }]
|
||||||
|
*
|
||||||
|
* @param request 请求
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public SmsResultDetail smsSendCallbackHandle(ServletRequest request) throws Exception {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
|
||||||
|
String paramStr = reader.readLine();
|
||||||
|
List<Map<String, Object>> params = JsonUtils.parseByType(paramStr, new TypeReference<List<Map<String, Object>>>() {
|
||||||
|
});
|
||||||
|
if (CollectionUtil.isNotEmpty(params)) {
|
||||||
|
Map<String, Object> sendResultParamMap = params.get(0);
|
||||||
|
return CallbackHelper.of(sendResultParamMap).toResultDetail();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信发送回调辅助类
|
||||||
|
*/
|
||||||
|
private static class CallbackHelper {
|
||||||
|
|
||||||
|
private final Map<String, Object> sendResultParamMap;
|
||||||
|
|
||||||
|
private CallbackHelper(Map<String, Object> sendResultParamMap) {
|
||||||
|
this.sendResultParamMap = sendResultParamMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CallbackHelper of(Map<String, Object> sendResultParamMap) {
|
||||||
|
return new CallbackHelper(sendResultParamMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSendStatus() {
|
||||||
|
return ((Boolean) sendResultParamMap.get(CallbackField.SUCCESS))
|
||||||
|
? SmsSendStatusEnum.SEND_SUCCESS.getStatus()
|
||||||
|
: SmsSendStatusEnum.SEND_FAIL.getStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBizId() {
|
||||||
|
return sendResultParamMap.get(CallbackField.BIZ_ID).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getErrMsg() {
|
||||||
|
return sendResultParamMap.get(CallbackField.ERR_MSG).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getErrCode() {
|
||||||
|
return sendResultParamMap.get(CallbackField.ERR_CODE).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getSendTime() {
|
||||||
|
return DateUtil.parseTime(sendResultParamMap.get(CallbackField.SEND_TIME).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return sendResultParamMap.get(CallbackField.PHONE_NUMBER).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOutId() {
|
||||||
|
return sendResultParamMap.get(CallbackField.OUT_ID).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SmsResultDetail toResultDetail() {
|
||||||
|
SmsResultDetail resultDetail = new SmsResultDetail();
|
||||||
|
resultDetail.setSendStatus(getSendStatus());
|
||||||
|
resultDetail.setApiId(getBizId());
|
||||||
|
resultDetail.setSendTime(getSendTime());
|
||||||
|
resultDetail.setPhone(getPhoneNumber());
|
||||||
|
resultDetail.setMessage(getErrMsg());
|
||||||
|
|
||||||
|
resultDetail.setCallbackResponseBody(generateSuccessResponseBody());
|
||||||
|
return resultDetail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成回调成功的返回对象
|
||||||
|
*/
|
||||||
|
private Map<String, Object> generateSuccessResponseBody() {
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("code", 0);
|
||||||
|
result.put("msg", "成功");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 回调接口字段定义
|
||||||
|
*/
|
||||||
|
private interface CallbackField {
|
||||||
|
//是否成功 boolean
|
||||||
|
String SUCCESS = "success";
|
||||||
|
|
||||||
|
//发送时间
|
||||||
|
String SEND_TIME = "send_time";
|
||||||
|
|
||||||
|
//错误信息
|
||||||
|
String ERR_MSG = "err_msg";
|
||||||
|
|
||||||
|
//错误编码
|
||||||
|
String ERR_CODE = "err_code";
|
||||||
|
|
||||||
|
//手机号
|
||||||
|
String PHONE_NUMBER = "phone_number";
|
||||||
|
|
||||||
|
//用户序列号 out_id
|
||||||
|
String OUT_ID = "out_id";
|
||||||
|
|
||||||
|
//biz_id 即 apiId 唯一标识
|
||||||
|
String BIZ_ID = "biz_id";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,68 +1,68 @@
|
|||||||
package cn.iocoder.dashboard.modules.infra.controller.redis;
|
//package cn.iocoder.dashboard.modules.infra.controller.redis;
|
||||||
|
//
|
||||||
import cn.hutool.core.util.StrUtil;
|
//import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.dashboard.common.pojo.CommonResult;
|
//import cn.iocoder.dashboard.common.pojo.CommonResult;
|
||||||
import cn.iocoder.dashboard.framework.redis.core.RedisKeyRegistry;
|
//import cn.iocoder.dashboard.framework.redis.core.RedisKeyRegistry;
|
||||||
import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO;
|
//import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO;
|
||||||
import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO;
|
//import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO;
|
||||||
import org.springframework.data.redis.connection.RedisServerCommands;
|
//import org.springframework.data.redis.connection.RedisServerCommands;
|
||||||
import org.springframework.data.redis.core.RedisCallback;
|
//import org.springframework.data.redis.core.RedisCallback;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
//import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
//import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
//import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
//import org.springframework.web.bind.annotation.RestController;
|
||||||
|
//
|
||||||
import javax.annotation.Resource;
|
//import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
//import java.util.ArrayList;
|
||||||
import java.util.List;
|
//import java.util.List;
|
||||||
import java.util.Properties;
|
//import java.util.Properties;
|
||||||
import java.util.stream.Collectors;
|
//import java.util.stream.Collectors;
|
||||||
|
//
|
||||||
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
|
//import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
|
||||||
|
//
|
||||||
@RestController
|
//@RestController
|
||||||
@RequestMapping("/infra/redis")
|
//@RequestMapping("/infra/redis")
|
||||||
public class RedisController {
|
//public class RedisController {
|
||||||
|
//
|
||||||
@Resource
|
// @Resource
|
||||||
private StringRedisTemplate stringRedisTemplate;
|
// private StringRedisTemplate stringRedisTemplate;
|
||||||
|
//
|
||||||
// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')")
|
//// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')")
|
||||||
@GetMapping("/get-monitor-info")
|
// @GetMapping("/get-monitor-info")
|
||||||
public CommonResult<InfRedisMonitorRespVO> getRedisMonitorInfo() {
|
// public CommonResult<InfRedisMonitorRespVO> getRedisMonitorInfo() {
|
||||||
// 获得 Redis 统计信息
|
// // 获得 Redis 统计信息
|
||||||
Properties info = stringRedisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info);
|
// Properties info = stringRedisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info);
|
||||||
Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize);
|
// Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize);
|
||||||
Properties commandStats = stringRedisTemplate.execute((
|
// Properties commandStats = stringRedisTemplate.execute((
|
||||||
RedisCallback<Properties>) connection -> connection.info("commandstats"));
|
// RedisCallback<Properties>) connection -> connection.info("commandstats"));
|
||||||
assert commandStats != null; // 断言,避免警告
|
// assert commandStats != null; // 断言,避免警告
|
||||||
|
//
|
||||||
// 拼接结果返回
|
// // 拼接结果返回
|
||||||
InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize)
|
// InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize)
|
||||||
.commandStats(new ArrayList<>(commandStats.size())).build();
|
// .commandStats(new ArrayList<>(commandStats.size())).build();
|
||||||
commandStats.forEach((key, value) -> {
|
// commandStats.forEach((key, value) -> {
|
||||||
respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder()
|
// respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder()
|
||||||
.command(StrUtil.subAfter((String) key, "cmdstat_", false))
|
// .command(StrUtil.subAfter((String) key, "cmdstat_", false))
|
||||||
.calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ",")))
|
// .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ",")))
|
||||||
.usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ",")))
|
// .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ",")))
|
||||||
.build());
|
// .build());
|
||||||
});
|
// });
|
||||||
return success(respVO);
|
// return success(respVO);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')")
|
//// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')")
|
||||||
@GetMapping("/get-key-list")
|
// @GetMapping("/get-key-list")
|
||||||
public CommonResult<List<InfRedisKeyRespVO>> getKeyList() {
|
// public CommonResult<List<InfRedisKeyRespVO>> getKeyList() {
|
||||||
List<InfRedisKeyRespVO> respVOList = RedisKeyRegistry.list().stream()
|
// List<InfRedisKeyRespVO> respVOList = RedisKeyRegistry.list().stream()
|
||||||
.map(define -> InfRedisKeyRespVO.builder()
|
// .map(define -> InfRedisKeyRespVO.builder()
|
||||||
.keyTemplate(define.getKeyTemplate())
|
// .keyTemplate(define.getKeyTemplate())
|
||||||
.keyType(define.getKeyType().name())
|
// .keyType(define.getKeyType().name())
|
||||||
.valueType(define.getValueType().getName())
|
// .valueType(define.getValueType().getName())
|
||||||
.timeoutType(define.getTimeoutType().getType())
|
// .timeoutType(define.getTimeoutType().getType())
|
||||||
.timeout((int) define.getTimeout().getSeconds())
|
// .timeout((int) define.getTimeout().getSeconds())
|
||||||
.build())
|
// .build())
|
||||||
.collect(Collectors.toList());
|
// .collect(Collectors.toList());
|
||||||
return success(respVOList);
|
// return success(respVOList);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -1,41 +0,0 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.consumer.sms;
|
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
|
||||||
import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
|
|
||||||
import cn.iocoder.dashboard.framework.sms.core.SmsResult;
|
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage;
|
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.sms.SmsSendMessage;
|
|
||||||
import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
|
|
||||||
import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 针对 {@link SysDeptRefreshMessage} 的消费者
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
@Slf4j
|
|
||||||
public class SmsSendConsumer extends AbstractChannelMessageListener<SmsSendMessage> {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private SysSmsChannelService smsChannelService;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private SysSmsQueryLogService smsQueryLogService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onMessage(SmsSendMessage message) {
|
|
||||||
log.info("[onMessage][收到 发送短信 消息], content: " + message.toString());
|
|
||||||
AbstractSmsClient smsClient = smsChannelService.getSmsClient(message.getSmsBody().getTemplateCode());
|
|
||||||
String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(message.getSmsBody().getTemplateCode());
|
|
||||||
|
|
||||||
SmsResult result = smsClient.send(templateApiId, message.getSmsBody(), message.getTargetPhones());
|
|
||||||
|
|
||||||
smsQueryLogService.afterSendLog(message.getSmsBody().getSmsLogId(), result);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.message.sms;
|
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
|
||||||
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 部门数据刷新 Message
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class SmsSendMessage implements ChannelMessage {
|
|
||||||
|
|
||||||
private SmsBody smsBody;
|
|
||||||
|
|
||||||
private List<String> targetPhones;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getChannel() {
|
|
||||||
return "sms.send";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.consumer.dept;
|
package cn.iocoder.dashboard.modules.system.redis.mq.consumer.dept;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.dept.SysDeptRefreshMessage;
|
||||||
import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
|
import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.consumer.dict;
|
package cn.iocoder.dashboard.modules.system.redis.mq.consumer.dict;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.dict.SysDictDataRefreshMessage;
|
||||||
import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService;
|
import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.consumer.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.consumer.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysMenuRefreshMessage;
|
||||||
import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
|
import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.consumer.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.consumer.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleMenuRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleMenuRefreshMessage;
|
||||||
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.consumer.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.consumer.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleRefreshMessage;
|
||||||
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
|
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
//package cn.iocoder.dashboard.modules.system.redis.mq.consumer.sms;
|
||||||
|
//
|
||||||
|
//import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
|
//import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
|
||||||
|
//import cn.iocoder.dashboard.framework.sms.core.SmsResult;
|
||||||
|
//import cn.iocoder.dashboard.modules.system.redis.mq.message.dept.SysDeptRefreshMessage;
|
||||||
|
//import cn.iocoder.dashboard.modules.system.redis.stream.sms.SmsSendMessage;
|
||||||
|
//import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
|
||||||
|
//import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService;
|
||||||
|
//import lombok.extern.slf4j.Slf4j;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.data.redis.connection.stream.Consumer;
|
||||||
|
//import org.springframework.data.redis.connection.stream.ObjectRecord;
|
||||||
|
//import org.springframework.data.redis.connection.stream.ReadOffset;
|
||||||
|
//import org.springframework.data.redis.connection.stream.StreamOffset;
|
||||||
|
//import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
//import org.springframework.stereotype.Component;
|
||||||
|
//
|
||||||
|
//import javax.annotation.Resource;
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * 针对 {@link SysDeptRefreshMessage} 的消费者
|
||||||
|
// *
|
||||||
|
// * @author 芋道源码
|
||||||
|
// */
|
||||||
|
//@Component
|
||||||
|
//@Slf4j
|
||||||
|
//public class SmsSendConsumer extends AbstractChannelMessageListener<SmsSendMessage> {
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private SysSmsChannelService smsChannelService;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private SysSmsQueryLogService smsQueryLogService;
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// StringRedisTemplate redisTemplate;
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public void onMessage(SmsSendMessage message) {
|
||||||
|
//
|
||||||
|
// redisTemplate.opsForStream().add(ObjectRecord.create("String", message));
|
||||||
|
//
|
||||||
|
// redisTemplate.opsForStream().read(Consumer.from("",""), StreamOffset.create("", ReadOffset.lastConsumed()));
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// log.info("[onMessage][收到 发送短信 消息], content: " + message.toString());
|
||||||
|
// AbstractSmsClient smsClient = smsChannelService.getSmsClient(message.getSmsBody().getTemplateCode());
|
||||||
|
// String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(message.getSmsBody().getTemplateCode());
|
||||||
|
//
|
||||||
|
// SmsResult result = smsClient.send(templateApiId, message.getSmsBody(), message.getTargetPhone());
|
||||||
|
// smsQueryLogService.afterSendLog(message.getSmsBody().getSmsLogId(), result);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.message.dept;
|
package cn.iocoder.dashboard.modules.system.redis.mq.message.dept;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.message.dict;
|
package cn.iocoder.dashboard.modules.system.redis.mq.message.dict;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.message.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.message.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.message.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.message.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.message.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.message.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.producer.dept;
|
package cn.iocoder.dashboard.modules.system.redis.mq.producer.dept;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.dept.SysDeptRefreshMessage;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.producer.dict;
|
package cn.iocoder.dashboard.modules.system.redis.mq.producer.dict;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.dict.SysDictDataRefreshMessage;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.producer.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.producer.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysMenuRefreshMessage;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.producer.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.producer.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleMenuRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleMenuRefreshMessage;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.mq.producer.permission;
|
package cn.iocoder.dashboard.modules.system.redis.mq.producer.permission;
|
||||||
|
|
||||||
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
||||||
import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleRefreshMessage;
|
import cn.iocoder.dashboard.modules.system.redis.mq.message.permission.SysRoleRefreshMessage;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.system.redis.stream.sms;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部门数据刷新 Message
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class SmsSendMessage {
|
||||||
|
|
||||||
|
private SmsBody smsBody;
|
||||||
|
|
||||||
|
private String targetPhone;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.system.redis.stream.sms;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsResult;
|
||||||
|
import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
|
||||||
|
import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService;
|
||||||
|
import cn.iocoder.dashboard.util.json.JsonUtils;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.data.redis.connection.stream.ObjectRecord;
|
||||||
|
import org.springframework.data.redis.stream.StreamListener;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信发送流消息监听器
|
||||||
|
*
|
||||||
|
* @author zzf
|
||||||
|
* @date 2021/3/9 16:35
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class SmsSendStreamConsumer implements StreamListener<String, ObjectRecord<String, SmsSendMessage>> {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysSmsChannelService smsChannelService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysSmsQueryLogService smsQueryLogService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(ObjectRecord<String, SmsSendMessage> record) {
|
||||||
|
SmsSendMessage message = record.getValue();
|
||||||
|
SmsBody body = message.getSmsBody();
|
||||||
|
log.info("[onMessage][收到 发送短信 消息], content: " + JsonUtils.toJsonString(body));
|
||||||
|
AbstractSmsClient smsClient = smsChannelService.getSmsClient(body.getTemplateCode());
|
||||||
|
String templateApiId = smsChannelService.getSmsTemplateApiIdByCode(body.getTemplateCode());
|
||||||
|
|
||||||
|
SmsResult result = smsClient.send(templateApiId, body, message.getTargetPhone());
|
||||||
|
smsQueryLogService.afterSendLog(body.getSmsLogId(), result);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.system.redis.stream.sms;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisStreamUtils;
|
||||||
|
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信发送流消息监听器
|
||||||
|
*
|
||||||
|
* @author zzf
|
||||||
|
* @date 2021/3/9 16:35
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class SmsSendStreamProducer {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送 {@link SmsSendMessage} 消息
|
||||||
|
*/
|
||||||
|
public void sendSmsSendMessage(SmsBody smsBody, String targetPhone) {
|
||||||
|
SmsSendMessage message = new SmsSendMessage();
|
||||||
|
message.setSmsBody(smsBody);
|
||||||
|
message.setTargetPhone(targetPhone);
|
||||||
|
|
||||||
|
RedisStreamUtils.sendChannelMessage(stringRedisTemplate, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue