1.场景描述
2.处理方案
3.相关代码
4.注意事项说明
定时任务处理
@Scheduled(cron = "0 5 0 * * *") // 每天凌晨5分处理
public void expireHandle(){
// 会员卡过期处理
handleStaffCardExpire();
}
定时任务处理定时业务逻辑处理
private void handleStaffCardExpire() {
try {
// 具体业务代码此处忽略具体实现
}
} catch (Exception ex) {
log.error("业务代码处理异常信息:{}",ex.getMessage());
// 发送短信操作:多个地方会存在发送短信的需求,所以在这里进行封装一下
sendMsgNotice("业务代码处理异常信息");
}
}
定时任务处理短信发送处理逻辑
private void sendMsgNotice(String msg) {
// 获取异常通知短信(此处对短信发送手机号做数据库持久化存储并动态获取)
String exceptionMobile = courseRecordMapper.findExceptionMobile();
// 发送短信通知
try {
SendSmsResponse sendSmsResponse = smsServiceImp.sendSms(exceptionMobile, msg, 2);
if(!"OK".equals(sendSmsResponse.getBody().getCode())){
throw new BussinessExcption(sendSmsResponse.getBody().getMessage());
}
} catch (Exception e) {
log.error("短信发送异常:{}",e.getMessage());
}
}
定时任务处理截止到这里整个定时任务异常通知的流程已经结束.下面是关于阿里云短信配置遇到的问题的说明,不使用短信通知方式的小伙伴以下内容可以忽略了.
定时任务处理关于短信发送配置说明:本项目使用阿里云短信服务,实际项目中不同的业务需求对应的短信配置信息以及短信内容是不同的,比如说注册登录的短信模板code是验证码数字,本场景中定时处理异常处理短信模板code需要提示具体的业务异常信息,所以对于不同的业务对应的阿里云短信模板配置以及变量属性和短信内容都会不同.这里对之前仅支持注册短信发送逻辑做了统一改造,可以适配多种不同的短信通知需求.
阿里云短信发送的具体逻辑(部分参数使用配置文件存储,此处不展示配置文件内容):
public SendSmsResponse sendSms(String mobile,String messageContent,int type) throws Exception {
Config config = new Config()
// AccessKey ID
.setAccessKeyId(manageConfig.getAccessKeyID())
// AccessKey Secret
.setAccessKeySecret(manageConfig.getAccessKeySecret());
// 访问的域名
config.endpoint = manageConfig.getSmsEndPoint();
com.aliyun.dysmsapi20170525.Client client = new com.aliyun.dysmsapi20170525.Client(config);
// 组装配置并发送
SendSmsRequest sendSmsRequest = new SendSmsRequest();
sendSmsRequest.setPhoneNumbers(mobile);
sendSmsRequest.setSignName(manageConfig.getSignName());
// modify by txm 2021/11/21 短信模板信息实现动态配置
MessageEnum messageEnum = MessageEnum.getMessageEnumByTpe(type);
sendSmsRequest.setTemplateCode(messageEnum.getTemCode());
sendSmsRequest.setTemplateParam("{\""+messageEnum.getVariableAttribute()+"\":\""+messageContent+"\"}");
SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
return sendSmsResponse;
}
这里使用枚举根据不同的业务类型进行获取不同的短信配置参数
public enum MessageEnum {
// 登录以及业务处理异常时短信配置信息
LOGIN_MSG(1, "短信模板信息","变量属性"),
BUSINESS_MSG(2,"短信模板信息","变量属性");
private int type;
private String temCode;
private String variableAttribute;
MessageEnum(int type, String temCode, String variableAttribute) {
this.type = type;
this.temCode = temCode;
this.variableAttribute = variableAttribute;
}
// 根据对应业务类型获取对应的短信配置信息
public static MessageEnum getMessageEnumByTpe(int type){
for (MessageEnum messageEnum : MessageEnum.values()) {
if(messageEnum.getType() == type){
return messageEnum;
}
}
return null;
}
// 省略get/set.....
}