org.sophon.module.sms.integration.client.impl.AbstractSmsClient Maven / Gradle / Ivy
The newest version!
package org.sophon.module.sms.integration.client.impl;
import java.util.List;
import java.util.function.Supplier;
import org.sophon.commons.core.KeyValue;
import org.sophon.commons.exception.ErrorCode;
import org.sophon.commons.exception.ErrorCodeMapping;
import org.sophon.commons.exception.SophonException;
import org.sophon.module.sms.commons.constants.SmsErrorCodeConstants;
import org.sophon.module.sms.integration.client.SmsClient;
import org.sophon.module.sms.integration.client.dto.SmsInvokeResult;
import org.sophon.module.sms.integration.client.dto.SmsReceiveRespDTO;
import org.sophon.module.sms.integration.client.dto.SmsSendRespDTO;
import org.sophon.module.sms.integration.client.dto.SmsTemplateRespDTO;
import org.sophon.module.sms.integration.prop.SmsChannelProperties;
import lombok.extern.slf4j.Slf4j;
/**
* 短信客户端模板方法
* @author moushaokun
* @since time: 2023-03-13 10:53
*/
@Slf4j
public abstract class AbstractSmsClient implements SmsClient {
/**
* 短信渠道配置
*/
protected volatile SmsChannelProperties properties;
/**
* 错误码枚举类
*/
protected final ErrorCodeMapping codeMapping;
public AbstractSmsClient(SmsChannelProperties properties, ErrorCodeMapping codeMapping) {
this.properties = prepareProperties(properties);
this.codeMapping = codeMapping;
}
/**
* 初始化
*/
public final void init() {
doInit();
log.info("[{}] 配置({}) 初始化完成", SmsErrorCodeConstants.MODULE_TAG, properties);
}
/**
* 自定义初始化
*/
protected abstract void doInit();
public final void refresh(SmsChannelProperties properties) {
// 判断是否更新
if (properties.equals(this.properties)) {
return;
}
log.info("[{}] 配置({})发生变化,重新初始化", SmsErrorCodeConstants.MODULE_TAG, properties);
this.properties = prepareProperties(properties);
// 初始化
this.init();
}
/**
* 在赋值给{@link this#properties}前,子类可根据需要预处理短信渠道配置
*
* @param properties 数据库中存储的短信渠道配置
* @return 满足子类实现的短信渠道配置
*/
protected SmsChannelProperties prepareProperties(SmsChannelProperties properties) {
return properties;
}
@Override
public final SmsInvokeResult sendSms(String bizNo, String mobile, String apiTemplateId, List> templateParams) {
return executeWithWrappedException(
() -> doSendSms(bizNo, mobile, apiTemplateId, templateParams),
() -> String.format("发送短信异常,bizNo(%s) mobile(%s) apiTemplateId(%s) templateParams(%s)", bizNo, mobile, apiTemplateId, templateParams),
() -> SmsErrorCodeConstants.INVOKE_ERROR_UNKNOWN
);
}
/**
* 执行发送
* @param bizNo 业务编号
* @param mobile 手机号
* @param apiTemplateId api模板id
* @param templateParams api模板参数
* @return 发送结果
*/
protected abstract SmsInvokeResult doSendSms(String bizNo, String mobile, String apiTemplateId, List> templateParams);
@Override
public SmsInvokeResult> parseSmsReceiveStatus(String text){
return executeWithWrappedException(
() -> doParseSmsReceiveStatus(text),
() -> String.format("text(%s) 解析发生异常", text),
() -> SmsErrorCodeConstants.PARSE_ERROR
);
}
/**
* 执行解析
* @param text 结果内容字符串
* @return 结构化的结果内容
*/
protected abstract SmsInvokeResult> doParseSmsReceiveStatus(String text);
@Override
public SmsInvokeResult getSmsTemplate(String apiTemplateId) {
return executeWithWrappedException(
() -> doGetSmsTemplate(apiTemplateId),
() -> String.format("获得短信模板 apiTemplateId(%s) 发生异常", apiTemplateId),
() -> SmsErrorCodeConstants.INVOKE_ERROR_UNKNOWN
);
}
/**
* 执行获取模板
* @param apiTemplateId api模板ID
* @return api模板信息
*/
protected abstract SmsInvokeResult doGetSmsTemplate(String apiTemplateId);
/**
* 统一处理非sdk异常,sdk异常需要在具体实现中自行转换处理
*/
protected SmsInvokeResult executeWithWrappedException(Supplier> executor, Supplier errorMessage, Supplier otherwise){
try {
return executor.get();
} catch (Throwable ex) {
String errorMsg = errorMessage.get();
log.error("[{}] {}", SmsErrorCodeConstants.MODULE_TAG, errorMsg, ex);
SophonException SophonException;
if(ex instanceof SophonException){
SophonException = (SophonException) ex;
} else {
SophonException = new SophonException(otherwise.get(), ex, errorMsg);
}
return SmsInvokeResult.error(SophonException);
}
}
}