实现短信通过redis stream异步发送,实现短信callback处理
parent
767cd90279
commit
225664550f
@ -1,15 +1,15 @@
|
||||
//package cn.iocoder.dashboard;
|
||||
//
|
||||
//import de.codecentric.boot.admin.server.config.EnableAdminServer;
|
||||
//import org.springframework.boot.SpringApplication;
|
||||
//import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
//
|
||||
//@SpringBootApplication
|
||||
//@EnableAdminServer
|
||||
//public class DashboardApplication {
|
||||
//
|
||||
// public static void main(String[] args) {
|
||||
// SpringApplication.run(DashboardApplication.class, args);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
package cn.iocoder.dashboard;
|
||||
|
||||
import de.codecentric.boot.admin.server.config.EnableAdminServer;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableAdminServer
|
||||
public class DashboardApplication {
|
||||
|
||||
public static void main(String[] 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;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.dashboard.common.pojo.CommonResult;
|
||||
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.InfRedisMonitorRespVO;
|
||||
import org.springframework.data.redis.connection.RedisServerCommands;
|
||||
import org.springframework.data.redis.core.RedisCallback;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/infra/redis")
|
||||
public class RedisController {
|
||||
|
||||
@Resource
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')")
|
||||
@GetMapping("/get-monitor-info")
|
||||
public CommonResult<InfRedisMonitorRespVO> getRedisMonitorInfo() {
|
||||
// 获得 Redis 统计信息
|
||||
Properties info = stringRedisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info);
|
||||
Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize);
|
||||
Properties commandStats = stringRedisTemplate.execute((
|
||||
RedisCallback<Properties>) connection -> connection.info("commandstats"));
|
||||
assert commandStats != null; // 断言,避免警告
|
||||
|
||||
// 拼接结果返回
|
||||
InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize)
|
||||
.commandStats(new ArrayList<>(commandStats.size())).build();
|
||||
commandStats.forEach((key, value) -> {
|
||||
respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder()
|
||||
.command(StrUtil.subAfter((String) key, "cmdstat_", false))
|
||||
.calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ",")))
|
||||
.usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ",")))
|
||||
.build());
|
||||
});
|
||||
return success(respVO);
|
||||
}
|
||||
|
||||
// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')")
|
||||
@GetMapping("/get-key-list")
|
||||
public CommonResult<List<InfRedisKeyRespVO>> getKeyList() {
|
||||
List<InfRedisKeyRespVO> respVOList = RedisKeyRegistry.list().stream()
|
||||
.map(define -> InfRedisKeyRespVO.builder()
|
||||
.keyTemplate(define.getKeyTemplate())
|
||||
.keyType(define.getKeyType().name())
|
||||
.valueType(define.getValueType().getName())
|
||||
.timeoutType(define.getTimeoutType().getType())
|
||||
.timeout((int) define.getTimeout().getSeconds())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
return success(respVOList);
|
||||
}
|
||||
|
||||
}
|
||||
//package cn.iocoder.dashboard.modules.infra.controller.redis;
|
||||
//
|
||||
//import cn.hutool.core.util.StrUtil;
|
||||
//import cn.iocoder.dashboard.common.pojo.CommonResult;
|
||||
//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.InfRedisMonitorRespVO;
|
||||
//import org.springframework.data.redis.connection.RedisServerCommands;
|
||||
//import org.springframework.data.redis.core.RedisCallback;
|
||||
//import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
//import org.springframework.web.bind.annotation.GetMapping;
|
||||
//import org.springframework.web.bind.annotation.RequestMapping;
|
||||
//import org.springframework.web.bind.annotation.RestController;
|
||||
//
|
||||
//import javax.annotation.Resource;
|
||||
//import java.util.ArrayList;
|
||||
//import java.util.List;
|
||||
//import java.util.Properties;
|
||||
//import java.util.stream.Collectors;
|
||||
//
|
||||
//import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
|
||||
//
|
||||
//@RestController
|
||||
//@RequestMapping("/infra/redis")
|
||||
//public class RedisController {
|
||||
//
|
||||
// @Resource
|
||||
// private StringRedisTemplate stringRedisTemplate;
|
||||
//
|
||||
//// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')")
|
||||
// @GetMapping("/get-monitor-info")
|
||||
// public CommonResult<InfRedisMonitorRespVO> getRedisMonitorInfo() {
|
||||
// // 获得 Redis 统计信息
|
||||
// Properties info = stringRedisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info);
|
||||
// Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize);
|
||||
// Properties commandStats = stringRedisTemplate.execute((
|
||||
// RedisCallback<Properties>) connection -> connection.info("commandstats"));
|
||||
// assert commandStats != null; // 断言,避免警告
|
||||
//
|
||||
// // 拼接结果返回
|
||||
// InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize)
|
||||
// .commandStats(new ArrayList<>(commandStats.size())).build();
|
||||
// commandStats.forEach((key, value) -> {
|
||||
// respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder()
|
||||
// .command(StrUtil.subAfter((String) key, "cmdstat_", false))
|
||||
// .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ",")))
|
||||
// .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ",")))
|
||||
// .build());
|
||||
// });
|
||||
// return success(respVO);
|
||||
// }
|
||||
//
|
||||
//// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')")
|
||||
// @GetMapping("/get-key-list")
|
||||
// public CommonResult<List<InfRedisKeyRespVO>> getKeyList() {
|
||||
// List<InfRedisKeyRespVO> respVOList = RedisKeyRegistry.list().stream()
|
||||
// .map(define -> InfRedisKeyRespVO.builder()
|
||||
// .keyTemplate(define.getKeyTemplate())
|
||||
// .keyType(define.getKeyType().name())
|
||||
// .valueType(define.getValueType().getName())
|
||||
// .timeoutType(define.getTimeoutType().getType())
|
||||
// .timeout((int) define.getTimeout().getSeconds())
|
||||
// .build())
|
||||
// .collect(Collectors.toList());
|
||||
// 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.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 lombok.extern.slf4j.Slf4j;
|
||||
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.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 lombok.extern.slf4j.Slf4j;
|
||||
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.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 lombok.extern.slf4j.Slf4j;
|
||||
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.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 lombok.extern.slf4j.Slf4j;
|
||||
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.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 lombok.extern.slf4j.Slf4j;
|
||||
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 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 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 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 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 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.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.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.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.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.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.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.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.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.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.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