Merge branch 'dev-3.0.x' into oa-plugin

This commit is contained in:
东风 2024-03-18 23:17:47 +08:00
commit 1214672d4d
86 changed files with 772 additions and 347 deletions

View File

@ -139,7 +139,7 @@ sms:
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request 到 dev-3.x 分支
4. 新建 Pull Request 到 dev-3.0.x 分支
```
## 贡献原则
- 我们原则上欢迎任何人为sms4j添加加瓦贡献代码

View File

@ -57,10 +57,10 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.boot.version>2.7.18</spring.boot.version>
<solon.version>2.5.4</solon.version>
<solon.version>2.6.5</solon.version>
<redisson.version>3.17.0</redisson.version>
<jdcloud.version>1.3.3</jdcloud.version>
<hutool.version>5.8.24</hutool.version>
<hutool.version>5.8.25</hutool.version>
<xmlblend.version>2.3.0</xmlblend.version>
<activation.version>1.1.1</activation.version>
<mail.version>1.6.2</mail.version>

View File

@ -26,6 +26,11 @@ public class MailSmtpConfig {
* */
private String fromAddress;
/**
* 发送人昵称
* */
private String nickName;
/**
* 服务器地址
* */
@ -45,23 +50,23 @@ public class MailSmtpConfig {
* 是否开启ssl 默认开启
* */
@Builder.Default
private String isSSL = "true";
private final String isSSL = "true";
/**
* 是否开启验证 默认开启
* */
@Builder.Default
private String isAuth = "true";
private final String isAuth = "true";
/**
* 重试间隔单位默认为5秒
*/
@Builder.Default
private int retryInterval = 5;
private final int retryInterval = 5;
/**
* 重试次数默认为1次
*/
@Builder.Default
private int maxRetries = 1;
private final int maxRetries = 1;
}

View File

@ -22,8 +22,6 @@ import java.util.Objects;
**/
public final class HtmlUtil {
private static final HtmlUtil htmlUtil = new HtmlUtil();
private HtmlUtil() {
}

View File

@ -19,7 +19,7 @@ import java.util.Map;
**/
public class MonitorFactory {
private final static Map<String, MonitorService> services = new HashMap<>();
private final static Map<String, MonitorService> SERVICES = new HashMap<>();
/**
* put
@ -30,7 +30,7 @@ public class MonitorFactory {
* @author :Wind
*/
public static void put(String key, MailImapConfig config, Monitor monitor){
services.put(key,new MonitorService(config,monitor));
SERVICES.put(key,new MonitorService(config,monitor));
}
/**
@ -40,7 +40,7 @@ public class MonitorFactory {
* @author :Wind
*/
public static void start(String key){
services.get(key).start();
SERVICES.get(key).start();
}
/**
@ -50,7 +50,7 @@ public class MonitorFactory {
* @author :Wind
*/
public static void stop(String key){
services.get(key).stop();
SERVICES.get(key).stop();
}
/**
@ -60,6 +60,6 @@ public class MonitorFactory {
* @author :Wind
*/
public static MailImapConfig getConfig(String key) {
return services.get(key).getMailImapConfig();
return SERVICES.get(key).getMailImapConfig();
}
}

View File

@ -1,6 +1,7 @@
package org.dromara.email.core.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import org.dromara.email.api.Blacklist;
import org.dromara.email.api.MailClient;
@ -15,6 +16,7 @@ import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@ -43,12 +45,21 @@ public class MailBuild {
props.put("mail.smtp.ssl.enable", config.getIsSSL());
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
this.session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(config.getUsername(), config.getPassword());
}
});
this.message = new MimeMessage(session);
try {
if (StrUtil.isEmpty(config.getNickName())){
this.message.setFrom(new InternetAddress(config.getFromAddress()));
}else {
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
}
} catch (UnsupportedEncodingException e) {
throw new MailException(e);
}
this.config = config;
this.retryInterval = config.getRetryInterval();
this.maxRetries = config.getMaxRetries();
@ -63,12 +74,21 @@ public class MailBuild {
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
this.session = Session.getInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(config.getUsername(), config.getPassword());
}
});
this.message = new MimeMessage(session);
try {
if (StrUtil.isEmpty(config.getNickName())){
this.message.setFrom(new InternetAddress(config.getFromAddress()));
}else {
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
}
} catch (UnsupportedEncodingException e) {
throw new MailException(e);
}
this.config = config;
this.blacklist = blacklist;
this.retryInterval = config.getRetryInterval();
@ -94,8 +114,9 @@ public class MailBuild {
if (Objects.isNull(blacklist)) {
return InternetAddress.parse(Objects.requireNonNull(CollUtil.join(source, ",")));
}
for (String s : blacklist.getBlacklist()) {
if (!source.contains(s)) {
List<String> black = blacklist.getBlacklist();
for (String s : source) {
if (!black.contains(s)) {
list.add(s);
}
}

View File

@ -34,8 +34,8 @@ import java.util.logging.Logger;
public class MailService implements MailClient {
private static Logger logger = Logger.getLogger("mailLog");
private MailBuild mailBuild;
private static final Logger logger = Logger.getLogger("mailLog");
private final MailBuild mailBuild;
private MailService(MailBuild mailBuild) {
this.mailBuild = mailBuild;
@ -137,7 +137,8 @@ public class MailService implements MailClient {
List<String> cc,
List<String> bcc) {
int maxRetries = mailBuild.getMaxRetries();
int retryCount = 1; // 初始值为1则while循环中少发送一次最后一次发送在判断 retryCount >= maxRetries 这里
// 初始值为1则while循环中少发送一次最后一次发送在判断 retryCount >= maxRetries 这里
int retryCount = 1;
boolean retryOnFailure = true;
while (retryOnFailure && retryCount < maxRetries) {
@ -150,7 +151,8 @@ public class MailService implements MailClient {
message = messageBuild(mailAddress, title, body, null, null, zipName, cc, bcc, files);
}
Transport.send(message);
retryOnFailure = false; // 发送成功停止重试
// 发送成功停止重试
retryOnFailure = false;
} catch (MessagingException | IOException e) {
retryCount++;
try {

View File

@ -1,5 +1,6 @@
package org.dromara.email.core.service;
import lombok.Getter;
import org.dromara.email.api.Monitor;
import org.dromara.email.comm.config.MailImapConfig;
import org.dromara.email.comm.entity.MonitorMessage;
@ -32,6 +33,7 @@ import java.util.TimerTask;
public class MonitorService{
private final Store store;
private Monitor monitor;
@Getter
private MailImapConfig mailImapConfig;
private Timer timer;
@ -127,7 +129,4 @@ public class MonitorService{
timer.cancel();
}
public MailImapConfig getMailImapConfig() {
return mailImapConfig;
}
}

View File

@ -12,6 +12,7 @@ import java.util.List;
* @since 2023/10/27 13:03
*/
public interface CoreMethodProcessor extends SmsProcessor {
@Override
default Object[] preProcessor(Method method, Object source, Object[] param) {
String name = method.getName();
int parameterCount = method.getParameterCount();

View File

@ -1,7 +1,6 @@
package org.dromara.sms4j.api.proxy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 执行器接口
@ -18,7 +17,7 @@ public interface SmsProcessor extends Order {
return null;
}
default Object exceptionHandleProcessor(Method method, Object source, Object[] param,Exception exception) throws InvocationTargetException, IllegalAccessException {
default Object exceptionHandleProcessor(Method method, Object source, Object[] param,Exception exception) {
return null;
}
}

View File

@ -1,6 +1,9 @@
package org.dromara.sms4j.comm.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* NumberOfParasmeters
* <p> 重载方法的参数个数
@ -8,6 +11,8 @@ package org.dromara.sms4j.comm.constant;
* @author :sh1yu
* 2023/11/01 19:33
**/
@Getter
@AllArgsConstructor
public enum NumberOfParasmeters {
//一个参数
ONE(1),
@ -15,11 +20,7 @@ public enum NumberOfParasmeters {
TWO(2),
//三个参数
THREE(3);
private int code;
NumberOfParasmeters(int code) {
this.code = code;
}
private final int code;
public static NumberOfParasmeters getNumberOfParasmetersEnum(int index) {
switch (index) {
@ -29,7 +30,10 @@ public enum NumberOfParasmeters {
return NumberOfParasmeters.TWO;
case 3:
return NumberOfParasmeters.THREE;
default:
break;
}
throw new IllegalArgumentException("building enum NumberOfParasmeters error,param not match");
}
}

View File

@ -59,5 +59,6 @@ public abstract class SupplierConstant {
* 鼎众
*/
public static final String DINGZHONG = "dingzhong";
public static final String QINIU = "qiniu";
}

View File

@ -6,8 +6,13 @@ import java.util.TimerTask;
@Data
public class Task {
private TimerTask runnable;//描述要执行的任务
private Long time;//什么时间执行,用时间戳来表示
/**
* 描述要执行的任务
*/
private TimerTask runnable;
/**
* 什么时间执行,用时间戳来表示
*/
private Long time;
}

View File

@ -1,11 +1,14 @@
package org.dromara.sms4j.comm.enumerate;
import lombok.Getter;
/**
* ConfigType
* <p>配置文件类型
* @author :Wind
* 2023/4/5 19:08
**/
@Getter
public enum ConfigType {
/** yaml配置文件 */
YAML("yaml"),
@ -18,7 +21,4 @@ public enum ConfigType {
this.name = name;
}
public String getName() {
return name;
}
}

View File

@ -2,7 +2,7 @@ package org.dromara.sms4j.comm.exception;
public class SmsBlendException extends RuntimeException{
public String code;
public String message;
public final String message;
public String requestId;
public SmsBlendException(String message) {

View File

@ -1,6 +1,13 @@
package org.dromara.sms4j.comm.exception;
import lombok.Setter;
@Setter
public class SmsSqlException extends RuntimeException{
/**
* -- SETTER --
* 设置 message
*/
private String message;
@Override
public String getMessage() {
@ -11,10 +18,4 @@ public class SmsSqlException extends RuntimeException{
this.message = message;
}
/**
* 设置 message
*/
public void setMessage(String message) {
this.message = message;
}
}

View File

@ -33,7 +33,7 @@ public abstract class SmsFactory {
* <p>key: configId短信服务对象的唯一标识</p>
* <p>value: 短信服务对象</p>
*/
private final static Map<String, SmsBlend> blends = new ConcurrentHashMap<>();
private final static Map<String, SmsBlend> BLENDS = new ConcurrentHashMap<>();
private SmsFactory() {
}
@ -170,7 +170,7 @@ public abstract class SmsFactory {
* @return 返回短信服务对象如果未找到则返回null
*/
public static SmsBlend getSmsBlend(String configId) {
return blends.get(configId);
return BLENDS.get(configId);
}
/**
@ -184,7 +184,7 @@ public abstract class SmsFactory {
if (StrUtil.isEmpty(supplier)) {
throw new SmsBlendException("供应商标识不能为空");
}
return blends.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).findFirst().orElse(null);
return BLENDS.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).findFirst().orElse(null);
}
/**
@ -198,7 +198,7 @@ public abstract class SmsFactory {
if (StrUtil.isEmpty(supplier)) {
throw new SmsBlendException("供应商标识不能为空");
}
list = blends.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).collect(Collectors.toList());
list = BLENDS.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).collect(Collectors.toList());
return list;
}
@ -208,7 +208,7 @@ public abstract class SmsFactory {
* @return 短信服务对象列表
*/
public static List<SmsBlend> getAll() {
return new ArrayList<>(blends.values());
return new ArrayList<>(BLENDS.values());
}
/**
@ -220,7 +220,7 @@ public abstract class SmsFactory {
if (smsBlend == null) {
throw new SmsBlendException("短信服务对象不能为空");
}
blends.put(smsBlend.getConfigId(), smsBlend);
BLENDS.put(smsBlend.getConfigId(), smsBlend);
SmsLoad.starConfig(smsBlend, 1);
}
@ -233,7 +233,7 @@ public abstract class SmsFactory {
if (smsBlend == null) {
throw new SmsBlendException("短信服务对象不能为空");
}
blends.put(smsBlend.getConfigId(), smsBlend);
BLENDS.put(smsBlend.getConfigId(), smsBlend);
SmsLoad.starConfig(smsBlend, weight);
}
@ -250,10 +250,10 @@ public abstract class SmsFactory {
throw new SmsBlendException("短信服务对象不能为空");
}
String configId = smsBlend.getConfigId();
if (blends.containsKey(configId)) {
if (BLENDS.containsKey(configId)) {
return false;
}
blends.put(configId, smsBlend);
BLENDS.put(configId, smsBlend);
SmsLoad.starConfig(smsBlend, 1);
return true;
}
@ -274,10 +274,10 @@ public abstract class SmsFactory {
throw new SmsBlendException("短信服务对象不能为空");
}
String configId = smsBlend.getConfigId();
if (blends.containsKey(configId)) {
if (BLENDS.containsKey(configId)) {
return false;
}
blends.put(configId, smsBlend);
BLENDS.put(configId, smsBlend);
SmsLoad.starConfig(smsBlend, weight);
return true;
}
@ -292,7 +292,7 @@ public abstract class SmsFactory {
* <p>当configId不存在时返回false</p>
*/
public static boolean unregister(String configId) {
SmsBlend blend = blends.remove(configId);
SmsBlend blend = BLENDS.remove(configId);
SmsLoad.getBeanLoad().removeLoadServer(blend);
return blend != null;
}

View File

@ -5,6 +5,7 @@ import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.universal.SupplierConfig;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -49,9 +50,11 @@ public class SmsLoad {
* @author :Wind
*/
public void removeLoadServer(SmsBlend LoadServer) {
for (int i = 0; i < LoadServers.size(); i++) {
if (LoadServers.get(i).getSmsServer().equals(LoadServer)) {
LoadServers.remove(i);
Iterator<LoadServer> iterator = LoadServers.iterator();
while (iterator.hasNext()) {
LoadServer server = iterator.next();
if (server.getSmsServer().getConfigId().equals(LoadServer.getConfigId())) {
iterator.remove();
break;
}
}

View File

@ -3,13 +3,10 @@ package org.dromara.sms4j.core.proxy;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.proxy.SmsProcessor;
import org.dromara.sms4j.api.proxy.SuppotFilter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
/**
@ -30,7 +27,7 @@ public class SmsInvocationHandler implements InvocationHandler {
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
public Object invoke(Object o, Method method, Object[] objects) {
Object result = null;
//前置执行器
objects = doPreProcess(smsBlend, method, objects);
@ -52,7 +49,7 @@ public class SmsInvocationHandler implements InvocationHandler {
return objects;
}
public void doErrorHandleProcess(Object o, Method method, Object[] objects,Exception e) throws InvocationTargetException, IllegalAccessException {
public void doErrorHandleProcess(Object o, Method method, Object[] objects,Exception e) {
for (SmsProcessor processor : processors) {
processor.exceptionHandleProcessor(method, o, objects,e);
}

View File

@ -8,8 +8,8 @@ import org.dromara.sms4j.api.proxy.Order;
import org.dromara.sms4j.api.proxy.SmsProcessor;
import org.dromara.sms4j.api.proxy.SuppotFilter;
import org.dromara.sms4j.api.proxy.aware.SmsBlendConfigAware;
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
import org.dromara.sms4j.api.proxy.aware.SmsConfigAware;
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -52,10 +52,8 @@ public abstract class SmsProxyFactory {
//判断当前的执行器有没有开厂商过滤支不支持当前厂商
if (processor instanceof SuppotFilter) {
List<String> supports = ((SuppotFilter) processor).getSupports();
boolean exsit = supports.stream().filter(support -> support.equals(smsBlend.getSupplier())).findAny().isPresent();
if (!exsit) {
return true;
}
boolean exsit = supports.stream().anyMatch(support -> support.equals(smsBlend.getSupplier()));
return !exsit;
}
return false;
}
@ -93,7 +91,7 @@ public abstract class SmsProxyFactory {
if (null != smsDao) {
return smsDao;
}
log.info("尝试框架加载失败最终使用默认SmsDao");
log.debug("未找到合适框架加载最终使用默认SmsDao如无自实现SmsDao请忽略本消息");
return SmsDaoDefaultImpl.getInstance();
}
@ -106,7 +104,7 @@ public abstract class SmsProxyFactory {
log.info("{}:加载SmsDao成功使用{}", frameworkName,smsDao.getClass().getName());
return smsDao;
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
log.info("{}:加载SmsDao失败尝试其他框架加载......", frameworkName);
log.debug("{}:尝试其他框架加载......", frameworkName);
}
return null;
}

View File

@ -4,12 +4,13 @@ import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.dao.SmsDao;
import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
import org.dromara.sms4j.api.proxy.aware.SmsConfigAware;
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.provider.config.SmsConfig;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 黑名单前置拦截执行器
@ -17,9 +18,9 @@ import java.util.*;
* @author sh1yu
* @since 2023/10/27 13:03
*/
@Setter
@Slf4j
public class BlackListProcessor implements CoreMethodProcessor, SmsDaoAware {
@Setter
SmsDao smsDao;
@Override
@ -53,7 +54,7 @@ public class BlackListProcessor implements CoreMethodProcessor, SmsDaoAware {
return;
}
for (String phone : phones) {
if (blackList.stream().filter(black -> black.replace("-","").equals(phone)).findAny().isPresent()) {
if (blackList.stream().anyMatch(black -> black.replace("-","").equals(phone))) {
throw new SmsBlendException("The phone:", phone + " hit global blacklist");
}
}

View File

@ -17,14 +17,14 @@ import java.util.List;
* @author sh1yu
* @since 2023/10/27 13:03
*/
@Setter
@Slf4j
public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, SmsConfigAware {
@Setter
SmsDao smsDao;
@Setter
Object smsConfig;
@Override
public int getOrder(){
return 1;
}
@ -32,28 +32,28 @@ public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, S
@Override
public Object[] preProcessor(Method method, Object source, Object[] param) {
//添加到黑名单
if (method.getName().equals("joinInBlacklist")) {
if ("joinInBlacklist".equals(method.getName())) {
String cacheKey = getCacheKey();
ArrayList<String> blackList = getBlackList(cacheKey);
blackList.add((String) param[0]);
flushBlackList(cacheKey,blackList);
}
//从黑名单移除
if (method.getName().equals("removeFromBlacklist")) {
if ("removeFromBlacklist".equals(method.getName())) {
String cacheKey = getCacheKey();
ArrayList<String> blackList = getBlackList(cacheKey);
blackList.remove((String) param[0]);
flushBlackList(cacheKey,blackList);
}
//批量添加到黑名单
if (method.getName().equals("batchJoinBlacklist")) {
if ("batchJoinBlacklist".equals(method.getName())) {
String cacheKey = getCacheKey();
ArrayList<String> blackList = getBlackList(cacheKey);
blackList.addAll((List<String>) param[0]);
flushBlackList(cacheKey,blackList);
}
//批量从黑名单移除
if (method.getName().equals("batchRemovalFromBlacklist")) {
if ("batchRemovalFromBlacklist".equals(method.getName())) {
String cacheKey = getCacheKey();
ArrayList<String> blackList = getBlackList(cacheKey);
blackList.removeAll((List<String>) param[0]);
@ -62,12 +62,21 @@ public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, S
return param;
}
//构建cachekey
/**
* 构建CacheKey
*
* @return CacheKey
*/
public String getCacheKey(){
return "sms:blacklist:global";
}
//获取黑名单没有就新建
/**
* 获取黑名单没有就新建
*
* @param cacheKey 缓存key
* @return 黑名单
*/
public ArrayList<String> getBlackList(String cacheKey) {
ArrayList<String> blackList;
Object cache = smsDao.get(cacheKey);
@ -80,7 +89,12 @@ public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, S
return blackList;
}
//让黑名单生效
/**
* 让黑名单生效
*
* @param cacheKey 缓存key
* @param blackList 黑命令
*/
public void flushBlackList(String cacheKey ,ArrayList<String> blackList) {
smsDao.set(cacheKey, blackList);
}

View File

@ -1,10 +1,13 @@
package org.dromara.sms4j.core.proxy.processor;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
/**
@ -45,22 +48,19 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
}
public void validateMessage(Object messageObj) {
if (messageObj instanceof String){
String message = (String) messageObj;
if (null == message || "".equals(message)) {
if(Objects.isNull(messageObj)){
throw new SmsBlendException("cant send a null message!");
}
}
if (messageObj instanceof Map){
Map message = (Map) messageObj;
if (message.size()<1) {
if (messageObj instanceof String){
String message = (String) messageObj;
if (StrUtil.isBlank(message)) {
throw new SmsBlendException("cant send a null message!");
}
}
}
public void validatePhone(String phone) {
if (null == phone || "".equals(phone)) {
if (StrUtil.isNotEmpty(phone)) {
throw new SmsBlendException("cant send message to null!");
}
}
@ -70,7 +70,7 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
throw new SmsBlendException("cant send message to null!");
}
for (String phone : phones) {
if (null != phone && !"".equals(phone)) {
if (StrUtil.isNotBlank(phone)) {
return;
}
}
@ -78,7 +78,7 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
}
public void validateMessages(String templateId, LinkedHashMap<String, String> messages) {
if (null != templateId && !"".equals(templateId) && (messages == null || messages.size() < 1)) {
if (StrUtil.isEmpty(templateId) && messages == null) {
throw new SmsBlendException("cant use template without template param");
}
}

View File

@ -22,6 +22,7 @@ import java.util.Objects;
* @author sh1yu
* @since 2023/10/27 13:03
*/
@Setter
@Slf4j
public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware {
static Long minTimer = 60 * 1000L;
@ -31,7 +32,6 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware {
/**
* 缓存实例
*/
@Setter
private SmsDao smsDao;
@Override
@ -61,31 +61,39 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware {
public void doRestricted(List<String> phones) {
if (Objects.isNull(smsDao)) {
throw new SmsBlendException("The dao tool could not be found");
throw new SmsBlendException("The smsDao tool could not be found");
}
SmsConfig config = BeanFactory.getSmsConfig();
Integer accountMax = config.getAccountMax(); // 每日最大发送量
Integer minuteMax = config.getMinuteMax(); // 每分钟最大发送量
// 如果未开始限制则不做处理
if (!config.getRestricted()){
return;
}
// 每日最大发送量
Integer accountMax = config.getAccountMax();
// 每分钟最大发送量
Integer minuteMax = config.getMinuteMax();
for (String phone : phones) {
if (SmsUtils.isNotEmpty(accountMax)) { // 是否配置了每日限制
// 是否配置了每日限制
if (SmsUtils.isNotEmpty(accountMax)) {
Integer i = (Integer) smsDao.get(REDIS_KEY + phone + "max");
if (SmsUtils.isEmpty(i)) {
smsDao.set(REDIS_KEY + phone + "max", 1, accTimer / 1000);
} else if (i >= accountMax) {
log.info("The phone:" + phone + ",number of short messages reached the maximum today");
throw new SmsBlendException("The phone:" + phone + ",number of short messages reached the maximum today");
log.info("The phone: {},number of short messages reached the maximum today", phone);
throw new SmsBlendException("The phone: {},number of short messages reached the maximum today", phone);
} else {
smsDao.set(REDIS_KEY + phone + "max", i + 1, accTimer / 1000);
}
}
if (SmsUtils.isNotEmpty(minuteMax)) { // 是否配置了每分钟最大限制
// 是否配置了每分钟最大限制
if (SmsUtils.isNotEmpty(minuteMax)) {
Integer o = (Integer) smsDao.get(REDIS_KEY + phone);
if (SmsUtils.isNotEmpty(o)) {
if (o < minuteMax) {
smsDao.set(REDIS_KEY + phone, o + 1, minTimer / 1000);
} else {
log.info("The phone:" + phone + ",number of short messages reached the maximum today");
throw new SmsBlendException("The phone:", phone + " Text messages are sent too often");
log.info("The phone: {},number of short messages reached the maximum today", phone);
throw new SmsBlendException("The phone: {} Text messages are sent too often", phone);
}
} else {
smsDao.set(REDIS_KEY + phone, 1, minTimer / 1000);

View File

@ -4,17 +4,14 @@ import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.dao.SmsDao;
import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
import org.dromara.sms4j.api.proxy.SmsProcessor;
import org.dromara.sms4j.api.proxy.aware.SmsBlendConfigAware;
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.provider.config.BaseConfig;
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
import java.lang.reflect.Method;
import java.util.*;
import java.util.Map;
/**
@ -23,6 +20,7 @@ import java.util.*;
* @author sh1yu
* @since 2023/10/27 13:03
*/
@Setter
@Slf4j
public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware, SmsBlendConfigAware {
@ -31,10 +29,8 @@ public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware
/**
* 缓存实例
*/
@Setter
private SmsDao smsDao;
@Setter
Map smsBlendsConfig;
@Override
@ -52,16 +48,12 @@ public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware
String configId = smsBlend.getConfigId();
Map targetConfig = (Map) smsBlendsConfig.get(configId);
Object maximumObj = targetConfig.get("maximum");
if (null == maximumObj) {
log.info("配置信息未能加载到本拦截器,跳过渠道级上限前置拦截执行器");
return param;
}
if (SmsUtils.isEmpty(maximumObj)) {
return param;
}
int maximum = 0;
try{
maximum = (int) maximumObj ;
maximum = Integer.parseInt(String.valueOf(maximumObj)) ;
}catch (Exception e){
log.error("获取厂商级发送上限参数错误!请检查!");
throw new IllegalArgumentException("获取厂商级发送上限参数错误");
@ -70,8 +62,8 @@ public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware
if (SmsUtils.isEmpty(i)) {
smsDao.set(REDIS_KEY + configId + "maximum", 1);
} else if (i >= maximum) {
log.info("The channel:" + configId + ",messages reached the maximum");
throw new SmsBlendException("The channel:" + configId + ",messages reached the maximum");
log.info("The channel: {},messages reached the maximum", configId);
throw new SmsBlendException("The channel: {},messages reached the maximum", configId);
} else {
smsDao.set(REDIS_KEY + configId + "maximum", i + 1);
}

View File

@ -26,6 +26,11 @@ public class MailSmtpConfig {
* */
private String fromAddress;
/**
* 发送人昵称
* */
private String nickName;
/**
* 服务器地址
* */
@ -45,23 +50,23 @@ public class MailSmtpConfig {
* 是否开启ssl 默认开启
* */
@Builder.Default
private String isSSL = "true";
private final String isSSL = "true";
/**
* 是否开启验证 默认开启
* */
@Builder.Default
private String isAuth = "true";
private final String isAuth = "true";
/**
* 重试间隔单位默认为5秒
*/
@Builder.Default
private int retryInterval = 5;
private final int retryInterval = 5;
/**
* 重试次数默认为1次
*/
@Builder.Default
private int maxRetries = 1;
private final int maxRetries = 1;
}

View File

@ -1,7 +1,7 @@
package org.dromara.email.jakarta.comm.entity;
import lombok.Data;
import jakarta.mail.Multipart;
import lombok.Data;
import java.util.Date;

View File

@ -22,8 +22,6 @@ import java.util.Objects;
**/
public final class HtmlUtil {
private static final HtmlUtil htmlUtil = new HtmlUtil();
private HtmlUtil() {
}

View File

@ -1,12 +1,12 @@
package org.dromara.email.jakarta.core.factory;
import jakarta.mail.MessagingException;
import org.dromara.email.jakarta.api.Blacklist;
import org.dromara.email.jakarta.api.MailClient;
import org.dromara.email.jakarta.comm.config.MailSmtpConfig;
import org.dromara.email.jakarta.comm.errors.MailException;
import org.dromara.email.jakarta.core.service.MailBuild;
import jakarta.mail.MessagingException;
import java.util.HashMap;
import java.util.Map;

View File

@ -19,7 +19,7 @@ import java.util.Map;
**/
public class MonitorFactory {
private final static Map<String, MonitorService> services = new HashMap<>();
private final static Map<String, MonitorService> SERVICES = new HashMap<>();
/**
* put
@ -30,7 +30,7 @@ public class MonitorFactory {
* @author :Wind
*/
public static void put(String key, MailImapConfig config, Monitor monitor){
services.put(key,new MonitorService(config,monitor));
SERVICES.put(key,new MonitorService(config,monitor));
}
/**
@ -40,7 +40,7 @@ public class MonitorFactory {
* @author :Wind
*/
public static void start(String key){
services.get(key).start();
SERVICES.get(key).start();
}
/**
@ -50,7 +50,7 @@ public class MonitorFactory {
* @author :Wind
*/
public static void stop(String key){
services.get(key).stop();
SERVICES.get(key).stop();
}
/**
@ -60,6 +60,6 @@ public class MonitorFactory {
* @author :Wind
*/
public static MailImapConfig getConfig(String key) {
return services.get(key).getMailImapConfig();
return SERVICES.get(key).getMailImapConfig();
}
}

View File

@ -1,12 +1,7 @@
package org.dromara.email.jakarta.core.service;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import org.dromara.email.jakarta.api.Blacklist;
import org.dromara.email.jakarta.api.MailClient;
import org.dromara.email.jakarta.comm.config.MailSmtpConfig;
import org.dromara.email.jakarta.comm.errors.MailException;
import cn.hutool.core.util.StrUtil;
import jakarta.mail.Authenticator;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
@ -15,6 +10,13 @@ import jakarta.mail.Session;
import jakarta.mail.internet.AddressException;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import lombok.Data;
import org.dromara.email.jakarta.api.Blacklist;
import org.dromara.email.jakarta.api.MailClient;
import org.dromara.email.jakarta.comm.config.MailSmtpConfig;
import org.dromara.email.jakarta.comm.errors.MailException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@ -43,12 +45,21 @@ public class MailBuild {
props.put("mail.smtp.ssl.enable", config.getIsSSL());
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
this.session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(config.getUsername(), config.getPassword());
}
});
this.message = new MimeMessage(session);
try {
if (StrUtil.isEmpty(config.getNickName())){
this.message.setFrom(new InternetAddress(config.getFromAddress()));
}else {
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
}
} catch (UnsupportedEncodingException e) {
throw new MailException(e);
}
this.config = config;
this.retryInterval = config.getRetryInterval();
this.maxRetries = config.getMaxRetries();
@ -63,12 +74,21 @@ public class MailBuild {
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
this.session = Session.getInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(config.getUsername(), config.getPassword());
}
});
this.message = new MimeMessage(session);
try {
if (StrUtil.isEmpty(config.getNickName())){
this.message.setFrom(new InternetAddress(config.getFromAddress()));
}else {
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
}
} catch (UnsupportedEncodingException e) {
throw new MailException(e);
}
this.config = config;
this.blacklist = blacklist;
this.retryInterval = config.getRetryInterval();
@ -94,8 +114,9 @@ public class MailBuild {
if (Objects.isNull(blacklist)) {
return InternetAddress.parse(Objects.requireNonNull(CollUtil.join(source, ",")));
}
for (String s : blacklist.getBlacklist()) {
if (!source.contains(s)) {
List<String> black = blacklist.getBlacklist();
for (String s : source) {
if (!black.contains(s)) {
list.add(s);
}
}

View File

@ -9,6 +9,12 @@ import cn.hutool.http.HttpUtil;
import jakarta.activation.DataHandler;
import jakarta.activation.DataSource;
import jakarta.activation.FileDataSource;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Multipart;
import jakarta.mail.Transport;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMultipart;
import jakarta.mail.util.ByteArrayDataSource;
import org.dromara.email.jakarta.api.MailClient;
import org.dromara.email.jakarta.comm.constants.FileConstants;
@ -17,13 +23,6 @@ import org.dromara.email.jakarta.comm.errors.MailException;
import org.dromara.email.jakarta.comm.utils.HtmlUtil;
import org.dromara.email.jakarta.comm.utils.ZipUtils;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Multipart;
import jakarta.mail.Transport;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMultipart;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -34,8 +33,8 @@ import java.util.logging.Logger;
public class MailService implements MailClient {
private static Logger logger = Logger.getLogger("mailLog");
private MailBuild mailBuild;
private static final Logger logger = Logger.getLogger("mailLog");
private final MailBuild mailBuild;
private MailService(MailBuild mailBuild) {
this.mailBuild = mailBuild;
@ -131,7 +130,8 @@ public class MailService implements MailClient {
List<String> cc,
List<String> bcc) {
int maxRetries = mailBuild.getMaxRetries();
int retryCount = 1; // 初始值为1则while循环中少发送一次最后一次发送在判断 retryCount >= maxRetries 这里
// 初始值为1则while循环中少发送一次最后一次发送在判断 retryCount >= maxRetries 这里
int retryCount = 1;
boolean retryOnFailure = true;
while (retryOnFailure && retryCount < maxRetries) {
@ -144,7 +144,8 @@ public class MailService implements MailClient {
message = messageBuild(mailAddress, title, body, null, null, zipName, cc, bcc, files);
}
Transport.send(message);
retryOnFailure = false; // 发送成功停止重试
// 发送成功停止重试
retryOnFailure = false;
} catch (MessagingException | IOException e) {
retryCount++;
try {

View File

@ -1,10 +1,5 @@
package org.dromara.email.jakarta.core.service;
import org.dromara.email.jakarta.api.Monitor;
import org.dromara.email.jakarta.comm.config.MailImapConfig;
import org.dromara.email.jakarta.comm.entity.MonitorMessage;
import org.dromara.email.jakarta.comm.errors.MailException;
import jakarta.mail.BodyPart;
import jakarta.mail.Flags;
import jakarta.mail.Folder;
@ -14,6 +9,12 @@ import jakarta.mail.Multipart;
import jakarta.mail.Session;
import jakarta.mail.Store;
import jakarta.mail.search.FlagTerm;
import lombok.Getter;
import org.dromara.email.jakarta.api.Monitor;
import org.dromara.email.jakarta.comm.config.MailImapConfig;
import org.dromara.email.jakarta.comm.entity.MonitorMessage;
import org.dromara.email.jakarta.comm.errors.MailException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
@ -32,6 +33,7 @@ import java.util.TimerTask;
public class MonitorService{
private final Store store;
private Monitor monitor;
@Getter
private MailImapConfig mailImapConfig;
private Timer timer;
@ -127,7 +129,4 @@ public class MonitorService{
timer.cancel();
}
public MailImapConfig getMailImapConfig() {
return mailImapConfig;
}
}

View File

@ -19,10 +19,14 @@ import org.dromara.sms4j.cloopen.config.CloopenFactory;
import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.processor.*;
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
import org.dromara.sms4j.core.proxy.processor.BlackListProcessor;
import org.dromara.sms4j.core.proxy.processor.BlackListRecordingProcessor;
import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor;
import org.dromara.sms4j.core.proxy.processor.RestrictedProcessor;
import org.dromara.sms4j.core.proxy.processor.SingleBlendRestrictedProcessor;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
@ -43,7 +47,6 @@ import org.dromara.sms4j.zhutong.config.ZhutongFactory;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;

View File

@ -1,15 +1,13 @@
package org.dromara.sms4j.javase.config;
import lombok.Getter;
import org.dromara.sms4j.api.dao.SmsDao;
public class SESmsDaoHolder {
@Getter
private static SmsDao smsDao = null;
public static SmsDao getSmsDao() {
return smsDao;
}
public static void setSmsDao(SmsDao smsDao) {
SESmsDaoHolder.smsDao = smsDao;
}

View File

@ -1,5 +1,8 @@
package org.dromara.oa.comm.enums;
import lombok.Getter;
@Getter
public enum MessageType {
// 钉钉支持类型
DINGTALK_TEXT("text"),
@ -30,7 +33,4 @@ public enum MessageType {
private final String name;
public String getName() {
return name;
}
}

View File

@ -1,13 +1,25 @@
package org.dromara.oa.comm.enums;
import lombok.Getter;
public enum OaType {
/**
* 钉钉
*/
DINGTALK("dingding", "https://oapi.dingtalk.com/robot/send?access_token=", true),
/**
* 微信
*/
WETALK("wetalk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true),
/**
* 飞书
*/
BYTETALK("feishu", "https://open.feishu.cn/open-apis/bot/v2/hook/", true),
;
private String type;
private String robotUrl;
@Getter
private final String type;
private final String robotUrl;
OaType(String type, String robotUrl, boolean enabled) {
@ -15,10 +27,6 @@ public enum OaType {
this.robotUrl = robotUrl;
}
public String getType() {
return type;
}
public String getUrl() {
return robotUrl;
}

View File

@ -52,6 +52,11 @@
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
</dependency>
</dependencies>

View File

@ -25,7 +25,7 @@ import static org.dromara.oa.comm.enums.OaType.BYTETALK;
@Slf4j
public class ByteTalkOaImpl extends AbstractOaBlend<ByteTalkConfig> {
private HttpClientImpl httpClient = new HttpClientImpl();
private final HttpClientImpl httpClient = new HttpClientImpl();
public ByteTalkOaImpl(ByteTalkConfig config) {
super(config);

View File

@ -1,22 +1,19 @@
package org.dromara.oa.core.byteTalk.utils;
import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.dromara.oa.comm.entity.Request;
import org.dromara.oa.comm.enums.MessageType;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.List;
import java.util.Objects;
import static org.dromara.oa.comm.enums.MessageType.BYTETALK_TEXT;
/**
* 飞书通知签名和信息构建
* @author dongfeng
@ -29,15 +26,9 @@ public class ByteTalkBuilder {
//把timestamp+"\n"+密钥当做签名字符串
String stringToSign = timestamp + "\n" + secret;
//使用HmacSHA256算法计算签名
Mac mac = null;
try {
mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException(e);
}
byte[] signData = mac.doFinal(new byte[]{});
return new String(Base64.getEncoder().encode(signData));
HMac mac = new HMac(HmacAlgorithm.HmacSHA256, stringToSign.getBytes(StandardCharsets.UTF_8));
byte[] signData = mac.digest(new byte[]{});
return Base64.encode(signData);
}

View File

@ -26,7 +26,7 @@ import java.util.Map;
@Slf4j
public class OaBlendsInitializer {
private List<OaBaseProviderFactory<? extends OaSender, ? extends OaSupplierConfig>> factoryList;
private final List<OaBaseProviderFactory<? extends OaSender, ? extends OaSupplierConfig>> factoryList;
private final OaConfig oaConfig;
private final Map<String, Map<String, Object>> blends;

View File

@ -25,7 +25,7 @@ import static org.dromara.oa.comm.enums.OaType.DINGTALK;
@Slf4j
public class DingTalkOaImpl extends AbstractOaBlend<DingTalkConfig> {
private HttpClientImpl httpClient = new HttpClientImpl();
private final HttpClientImpl httpClient = new HttpClientImpl();
/**
* 建造一个微信通知对象服务

View File

@ -1,25 +1,23 @@
package org.dromara.oa.core.dingTalk.utils;
import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.dromara.oa.comm.entity.Request;
import org.dromara.oa.comm.enums.MessageType;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.List;
import java.util.Objects;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_LINK;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_MARKDOWN;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_TEXT;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_LINK;
/**
* 钉钉通知签名和信息构建
@ -32,17 +30,11 @@ public class DingTalkBuilder {
Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
Mac mac = null;
HMac mac = new HMac(HmacAlgorithm.HmacSHA256, secret.getBytes(StandardCharsets.UTF_8));
byte[] signData = mac.digest(stringToSign.getBytes(StandardCharsets.UTF_8));
String sign;
try {
mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException(e);
}
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
String sign = null;
try {
sign = URLEncoder.encode(new String(Base64.getEncoder().encode(signData)), StandardCharsets.UTF_8.toString());
sign = URLEncoder.encode(Base64.encode(signData), StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}

View File

@ -26,6 +26,7 @@ public abstract class OaAbstractProviderFactory<S extends OaSender, C extends Oa
*
* @return 配置类
*/
@Override
public Class<C> getConfigClass() {
return configClass;
}

View File

@ -3,8 +3,6 @@ package org.dromara.oa.core.provider.factory;
import org.dromara.oa.api.OaSender;
import org.dromara.oa.comm.config.OaSupplierConfig;
import java.util.concurrent.Executor;
public interface OaBaseProviderFactory<S extends OaSender, C extends OaSupplierConfig> {
/**

View File

@ -1,10 +1,15 @@
package org.dromara.oa.core.provider.factory;
import org.dromara.oa.comm.task.delayed.DelayedTime;
import lombok.Getter;
import org.dromara.oa.comm.entity.Request;
import org.dromara.oa.comm.task.delayed.DelayedTime;
import org.dromara.oa.core.provider.config.OaConfig;
import java.util.concurrent.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class OaBeanFactory {
@ -12,15 +17,18 @@ public class OaBeanFactory {
private static DelayedTime delayedTime;
/** 线程池*/
@Getter
private static Executor executor;
/** 核心配置信息*/
private static OaConfig oaConfig;
/** 优先级队列*/
@Getter
private static PriorityBlockingQueue<Request> priorityBlockingQueue;
/** 优先级队列*/
@Getter
private static Boolean priorityExecutorThreadStatus = false;
private OaBeanFactory() {
@ -58,10 +66,6 @@ public class OaBeanFactory {
return priorityBlockingQueue;
}
public static Executor getExecutor() {
return executor;
}
public static OaConfig getSmsConfig(){
if (oaConfig == null){
oaConfig = new OaConfig();
@ -69,14 +73,6 @@ public class OaBeanFactory {
return oaConfig;
}
public static PriorityBlockingQueue<Request> getPriorityBlockingQueue(){
return priorityBlockingQueue;
}
public static Boolean getPriorityExecutorThreadStatus() {
return priorityExecutorThreadStatus;
}
public static Boolean setPriorityExecutorThreadStatus(Boolean bo) {
priorityExecutorThreadStatus=bo;
return priorityExecutorThreadStatus;

View File

@ -8,7 +8,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class OaFactory {
private final static Map<String, OaSender> configs = new ConcurrentHashMap<>();
private final static Map<String, OaSender> CONFIGS = new ConcurrentHashMap<>();
/**
* <p>创建各个厂商的实现类
@ -29,7 +29,7 @@ public class OaFactory {
if (smsBlend == null) {
throw new OaException("通知webhook服务对象不能为空");
}
configs.put(smsBlend.getConfigId(), smsBlend);
CONFIGS.put(smsBlend.getConfigId(), smsBlend);
}
public static OaSender createAndGetOa(OaSupplierConfig config) {
@ -47,7 +47,7 @@ public class OaFactory {
* @return 返回通知webhook服务对象如果未找到则返回null
*/
public static OaSender getSmsOaBlend(String configId) {
return configs.get(configId);
return CONFIGS.get(configId);
}
}

View File

@ -70,15 +70,18 @@ public abstract class AbstractOaBlend<C extends OaSupplierConfig> implements OaS
}
@Override
public final void senderAsync(Request request, MessageType messageType) {
pool.execute(() -> sender(request, messageType));
}
@Override
public final void senderAsync(Request request, MessageType messageType, OaCallBack callBack) {
CompletableFuture<Response> future = CompletableFuture.supplyAsync(() -> sender(request, messageType));
future.thenAcceptAsync(callBack::callBack);
}
@Override
public final void senderAsyncByPriority(Request request, MessageType messageType) {
request.setMessageType(messageType);
priorityQueueMap.offer(request);

View File

@ -7,7 +7,7 @@ import java.util.Map;
public class HttpClientImpl extends AbstractHttpClient {
@Override
public <T> String post(StringBuilder url, Map<String, String> headers, T message) throws Exception {
public <T> String post(StringBuilder url, Map<String, String> headers, T message) {
// 构建请求体
// 发送POST请求
HttpResponse response = HttpRequest.post(url.toString())

View File

@ -12,6 +12,6 @@ public interface MsgHttpClient {
String post(String url, Map<String, String> headers);
<T> String post(StringBuilder url, Map<String, String> headers, T message) throws Exception;
<T> String post(StringBuilder url, Map<String, String> headers, T message);
}

View File

@ -25,7 +25,7 @@ import static org.dromara.oa.comm.enums.OaType.WETALK;
@Slf4j
public class WeTalkOaImpl extends AbstractOaBlend<WeTalkConfig> {
private HttpClientImpl httpClient = new HttpClientImpl();
private final HttpClientImpl httpClient = new HttpClientImpl();
public WeTalkOaImpl(WeTalkConfig config) {
super(config);

View File

@ -65,13 +65,16 @@ public class AlibabaSmsImpl extends AbstractSmsBlend<AlibabaConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String messageStr = JSONUtil.toJsonStr(messages);
return getSmsResponse(phone, messageStr, templateId);
}
@ -85,6 +88,9 @@ public class AlibabaSmsImpl extends AbstractSmsBlend<AlibabaConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String messageStr = JSONUtil.toJsonStr(messages);
return getSmsResponse(SmsUtils.arrayToString(phones), messageStr, templateId);
}
@ -121,7 +127,7 @@ public class AlibabaSmsImpl extends AbstractSmsBlend<AlibabaConfig> {
private SmsResponse requestRetry(String phone, String message, String templateId) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponse(phone, message, templateId);
}

View File

@ -47,13 +47,16 @@ public class CloopenSmsImpl extends AbstractSmsBlend<CloopenConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
return massTexting(Collections.singletonList(phone), templateId, messages);
}
@ -66,6 +69,9 @@ public class CloopenSmsImpl extends AbstractSmsBlend<CloopenConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
CloopenHelper helper = new CloopenHelper(getConfig(), http);
Map<String, Object> paramMap = MapUtil.newHashMap(4, true);
paramMap.put("to", String.join(",", phones));

View File

@ -14,7 +14,6 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.comm.utils.SmsHttpUtils;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
/**
@ -66,7 +65,7 @@ public class CloopenHelper {
private SmsResponse requestRetry(Map<String, Object> paramMap) {
http.safeSleep(config.getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return smsResponse(paramMap);
}

View File

@ -52,13 +52,16 @@ public class CtyunSmsImpl extends AbstractSmsBlend<CtyunConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String messageStr = JSONUtil.toJsonStr(messages);
return getSmsResponse(phone, messageStr, templateId);
}
@ -72,6 +75,9 @@ public class CtyunSmsImpl extends AbstractSmsBlend<CtyunConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String messageStr = JSONUtil.toJsonStr(messages);
return getSmsResponse(SmsUtils.arrayToString(phones), messageStr, templateId);
}
@ -107,7 +113,7 @@ public class CtyunSmsImpl extends AbstractSmsBlend<CtyunConfig> {
private SmsResponse requestRetry(String phone, String message, String templateId) {
http.safeSleep(getConfig().getRetryInterval());
retry ++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponse(phone, message, templateId);
}

View File

@ -14,6 +14,7 @@ import org.dromara.sms4j.provider.service.AbstractSmsBlend;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.Executor;
/**
@ -68,6 +69,9 @@ public class DingZhongSmsImpl extends AbstractSmsBlend<DingZhongConfig> {
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
DingZhongHelper helper = new DingZhongHelper(getConfig(), http);
Map<String, Object> paramMap = MapUtil.newHashMap(5, true);
paramMap.put("cdkey", getConfig().getAccessKeyId());

View File

@ -10,7 +10,6 @@ import org.dromara.sms4j.comm.utils.SmsHttpUtils;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.dingzhong.config.DingZhongConfig;
import java.util.LinkedHashMap;
import java.util.Map;
/**
@ -55,7 +54,7 @@ public class DingZhongHelper {
private SmsResponse requestRetry(Map<String, Object> paramMap) {
http.safeSleep(config.getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return smsResponse(paramMap);
}

View File

@ -67,7 +67,7 @@ public class EmaySmsImpl extends AbstractSmsBlend<EmayConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@ -75,13 +75,16 @@ public class EmaySmsImpl extends AbstractSmsBlend<EmayConfig> {
private SmsResponse requestRetry(String phone, String message) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return sendMessage(phone, message);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
List<String> list = new ArrayList<>();
for (Map.Entry<String, String> entry : messages.entrySet()) {
list.add(entry.getValue());

View File

@ -51,13 +51,16 @@ public class HuaweiSmsImpl extends AbstractSmsBlend<HuaweiConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String url = getConfig().getUrl() + Constant.HUAWEI_REQUEST_URL;
List<String> list = new ArrayList<>();
for (Map.Entry<String, String> entry : messages.entrySet()) {
@ -88,7 +91,7 @@ public class HuaweiSmsImpl extends AbstractSmsBlend<HuaweiConfig> {
private SmsResponse requestRetry(String phone, String templateId, LinkedHashMap<String, String> messages) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return sendMessage(phone, templateId, messages);
}
@ -99,6 +102,9 @@ public class HuaweiSmsImpl extends AbstractSmsBlend<HuaweiConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
return sendMessage(CollUtil.join(phones, ","), templateId, messages);
}

View File

@ -1,6 +1,7 @@
package org.dromara.sms4j.huawei.utils;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import org.dromara.sms4j.comm.constant.Constant;
import javax.net.ssl.HttpsURLConnection;
@ -12,8 +13,6 @@ import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -21,11 +20,13 @@ import java.util.Map;
import java.util.UUID;
public class HuaweiBuilder {
private HuaweiBuilder(){}
private HuaweiBuilder() {
}
/**
* buildWsseHeader
* <p>构造X-WSSE参数值
*
* @author :Wind
*/
public static String buildWsseHeader(String appKey, String appSecret) {
@ -34,7 +35,8 @@ public class HuaweiBuilder {
return null;
}
String time = dateFormat(new Date());
String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce
// Nonce
String nonce = UUID.randomUUID().toString().replace("-", "");
MessageDigest md;
byte[] passwordDigest = null;
@ -45,8 +47,8 @@ public class HuaweiBuilder {
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String passwordDigestBase64Str = Base64.encode(passwordDigest); //PasswordDigest
// PasswordDigest
String passwordDigestBase64Str = Base64.encode(passwordDigest);
//若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
//passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
return String.format(Constant.HUAWEI_WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
@ -55,10 +57,15 @@ public class HuaweiBuilder {
static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@ -72,6 +79,7 @@ public class HuaweiBuilder {
/**
* buildRequestBody
* <p>构造请求Body体
*
* @param sender 国内短信签名通道号
* @param receiver 短信接收者
* @param templateId 短信模板id
@ -87,7 +95,7 @@ public class HuaweiBuilder {
System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
return null;
}
Map<String, String> map = new HashMap<String, String>();
Map<String, String> map = new HashMap<>();
map.put("from", sender);
map.put("to", receiver);
@ -131,17 +139,8 @@ public class HuaweiBuilder {
return stringBuffer.toString();
}
static String dateFormat(Date date){
return SDF.format(date);
private static String dateFormat(Date date) {
return DateUtil.format(date, Constant.HUAWEI_JAVA_DATE);
}
static Date strForDate(String date){
try {
return SDF.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
private static final SimpleDateFormat SDF = new SimpleDateFormat(Constant.HUAWEI_JAVA_DATE);
}

View File

@ -55,7 +55,7 @@ public class JdCloudSmsImpl extends AbstractSmsBlend<JdCloudConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@ -74,6 +74,9 @@ public class JdCloudSmsImpl extends AbstractSmsBlend<JdCloudConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
BatchSendRequest request;
try {
request = new BatchSendRequest();
@ -107,7 +110,7 @@ public class JdCloudSmsImpl extends AbstractSmsBlend<JdCloudConfig> {
private SmsResponse requestRetry(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return massTexting(phones, templateId, messages);
}

View File

@ -11,7 +11,13 @@ import org.dromara.sms4j.lianlu.req.LianLuRequest;
import org.dromara.sms4j.lianlu.utils.LianLuUtils;
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
import java.util.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
import java.util.concurrent.Executor;
@Slf4j
@ -28,6 +34,7 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
super(config);
}
@Override
public String getSupplier() {
return SupplierConstant.LIANLU;
}
@ -41,6 +48,7 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
* @param templateParam 模板变量
* @return
*/
@Override
public SmsResponse sendMessage(String phone, String templateParam) {
return this.massTexting(Collections.singletonList(phone), templateParam);
}
@ -48,7 +56,7 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@ -61,17 +69,23 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
* @param messages key无实际意义value为模板变量值
* @return
*/
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
return this.massTexting(Collections.singletonList(phone), templateId, messages);
}
@Override
public SmsResponse massTexting(List<String> phones, String templateParam) {
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("", templateParam);
return massTexting(phones, getConfig().getTemplateId(), map);
}
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
LianLuRequest req = getRequest();
req.setType(TEMPLATE_MSG)
.setPhoneNumberSet(phones)

View File

@ -4,7 +4,9 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeMap;
public class LianLuUtils {
private static final Set<String> IGNORE_FILED_SET = new HashSet<>();

View File

@ -64,7 +64,7 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@ -78,6 +78,9 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
*/
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
Optional.ofNullable(phone).orElseThrow(() -> new SmsBlendException("手机号不能为空"));
Optional.ofNullable(getConfig().getTemplateId()).orElseThrow(() -> new SmsBlendException("模板ID不能为空"));
String messageStr = messages.get("params");
@ -98,6 +101,9 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
if (phones.size() > 100) {
throw new SmsBlendException("单次发送超过最大发送上限建议每次群发短信人数低于100");
}
@ -142,7 +148,7 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
private SmsResponse requestRetry(String requestUrl, List<String> phones, String message, String templateId) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponse(requestUrl, phones, message, templateId);
}

View File

@ -30,6 +30,7 @@ public abstract class AbstractProviderFactory<S extends SmsBlend, C extends Supp
* 获取配置类
* @return 配置类
*/
@Override
public Class<C> getConfigClass() {
return configClass;
}

View File

@ -53,6 +53,11 @@ public class BeanFactory {
return executor;
}
public static Executor setExecutor(Executor exec) {
executor = exec;
return executor;
}
public static Executor getExecutor() {
if (executor == null){
// 创建一个线程池对象

View File

@ -63,6 +63,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @author :Wind
*/
@Override
public abstract SmsResponse sendMessage(String phone, String message);
/**
@ -72,6 +73,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param messages 模板内容
* @author :Wind
*/
@Override
public abstract SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages);
/**
@ -83,6 +85,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @author :Wind
*/
@Override
public abstract SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages);
/**
@ -92,6 +95,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @author :Wind
*/
@Override
public abstract SmsResponse massTexting(List<String> phones, String message);
/**
@ -101,6 +105,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @author :Wind
*/
@Override
public abstract SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages);
/**
@ -112,6 +117,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param callBack 回调
* @author :Wind
*/
@Override
public final void sendMessageAsync(String phone, String message, CallBack callBack){
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
@ -125,10 +131,9 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param message 发送内容
* @author :Wind
*/
@Override
public final void sendMessageAsync(String phone, String message){
pool.execute(() -> {
sendMessage(phone, message);
});
pool.execute(() -> sendMessage(phone, message));
}
/**
@ -141,6 +146,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @author :Wind
*/
@Override
public final void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack){
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone,templateId, messages), pool);
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
@ -154,10 +160,9 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param messages key为模板变量名称 value为模板变量值
* @author :Wind
*/
@Override
public final void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages){
pool.execute(() -> {
sendMessage(phone, templateId, messages);
});
pool.execute(() -> sendMessage(phone, templateId, messages));
}
/**
@ -169,6 +174,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param delayedTime 延迟时间
* @author :Wind
*/
@Override
public final void delayedMessage(String phone, String message, Long delayedTime){
this.delayed.schedule(new TimerTask() {
@Override
@ -188,6 +194,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param delayedTime 延迟的时间
* @author :Wind
*/
@Override
public final void delayedMessage(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime){
this.delayed.schedule(new TimerTask() {
@Override
@ -204,6 +211,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param phones 要群体发送的手机号码
* @author :Wind
*/
@Override
public final void delayMassTexting(List<String> phones, String message, Long delayedTime){
this.delayed.schedule(new TimerTask() {
@Override
@ -223,6 +231,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
* @param delayedTime 延迟的时间
* @author :Wind
*/
@Override
public final void delayMassTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime){
this.delayed.schedule(new TimerTask() {
@Override

View File

@ -0,0 +1,32 @@
package org.dromara.sms4j.qiniu.config;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.provider.config.BaseConfig;
/**
* @author Administrator
* @Date: 2024/1/30 15:56 30
* @描述: QiNiuConfig
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class QiNiuConfig extends BaseConfig {
private String baseUrl = "https://sms.qiniuapi.com";
private String templateName;
private String singleMsgUrl = "/v1/message/single";
private String massMsgUrl = "/v1/message";
private String signatureId;
@Override
public String getSupplier() {
return SupplierConstant.QINIU;
}
}

View File

@ -0,0 +1,34 @@
package org.dromara.sms4j.qiniu.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.qiniu.service.QiNiuSmsImpl;
/**
* @author Administrator
* @Date: 2024/1/30 16:06 29
* @描述: QiNiuFactory
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class QiNiuFactory extends AbstractProviderFactory<QiNiuSmsImpl, QiNiuConfig> {
private static final QiNiuFactory INSTANCE = new QiNiuFactory();
public static QiNiuFactory instance() {
return INSTANCE;
}
@Override
public QiNiuSmsImpl createSms(QiNiuConfig qiNiuConfig) {
return new QiNiuSmsImpl(qiNiuConfig);
}
@Override
public String getSupplier() {
return SupplierConstant.QINIU;
}
}

View File

@ -0,0 +1,135 @@
package org.dromara.sms4j.qiniu.service;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
import org.dromara.sms4j.qiniu.config.QiNiuConfig;
import org.dromara.sms4j.qiniu.util.QiNiuUtils;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;
/**
* @author Administrator
* @Date: 2024/1/30 16:06 59
* @描述: QiNiuSmsImpl
**/
@Slf4j
public class QiNiuSmsImpl extends AbstractSmsBlend<QiNiuConfig> {
private int retry = 0;
@Override
public String getSupplier() {
return SupplierConstant.QINIU;
}
public QiNiuSmsImpl(QiNiuConfig config, Executor pool, DelayedTime delayed) {
super(config, pool, delayed);
}
public QiNiuSmsImpl(QiNiuConfig config) {
super(config);
}
@Override
public SmsResponse sendMessage(String phone, String message) {
return sendSingleMsg(phone, getConfig().getTemplateId(), new LinkedHashMap<String, String>() {{
put(getConfig().getTemplateName(), message);
}});
}
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
return sendSingleMsg(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
return sendSingleMsg(phone, templateId, messages);
}
@Override
public SmsResponse massTexting(List<String> phones, String message) {
LinkedHashMap<String, String> params = new LinkedHashMap<>();
params.put(getConfig().getTemplateName(), message);
return senMassMsg(phones, getConfig().getTemplateId(), params);
}
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
return senMassMsg(phones, templateId, messages);
}
/**
* @return SmsResponse
* @author 初拥
* @date 2024/1/31 8:54
* @Description: 统一处理返回结果
*/
public SmsResponse handleRes(String url, HashMap<String, Object> params) {
JSONObject jsonObject = http.postJson(url, QiNiuUtils.getHeaderAndSign(url, params, getConfig()), params);
SmsResponse smsResponse = new SmsResponse();
smsResponse.setSuccess(ObjectUtil.isEmpty(jsonObject.getStr("error")));
smsResponse.setData(jsonObject);
smsResponse.setConfigId(getConfigId());
if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) {
retry = 0;
return smsResponse;
}
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {} 次重新发送", retry);
return handleRes(url, params);
}
/**
* @param phones
* @param templateId
* @param messages
* @return SmsResponse
* @author 初拥
* @date 2024/1/31 9:20
* @Description: 发送群发短信
*/
private SmsResponse senMassMsg(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String url = getConfig().getBaseUrl() + getConfig().getMassMsgUrl();
HashMap<String, Object> params = new HashMap<>();
params.put("template_id", templateId);
params.put("mobiles", phones.toArray());
params.put("parameters", messages);
return handleRes(url, params);
}
private SmsResponse sendSingleMsg(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
String url = getConfig().getBaseUrl() + getConfig().getSingleMsgUrl();
//手机号
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("mobile", phone);
hashMap.put("template_id", templateId);
hashMap.put("parameters", messages);
log.info("hashMap:{}", hashMap);
return handleRes(url, hashMap);
}
}

View File

@ -0,0 +1,70 @@
package org.dromara.sms4j.qiniu.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.qiniu.config.QiNiuConfig;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
/**
* @author Administrator
* @Date: 2024/1/30 16:37 50
* @描述: QiNiuUtils
**/
@Data
@Slf4j
public class QiNiuUtils {
private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
public static String getSignature(String method, String url, QiNiuConfig qiNiuConfig, String body, String signDate) {
URI reqUrl = URI.create(url);
StringBuilder dataToSign = new StringBuilder();
dataToSign.append(method.toUpperCase()).append(" ").append(reqUrl.getPath());
dataToSign.append("\nHost: ").append(reqUrl.getHost());
dataToSign.append("\n").append("Content-Type").append(": ").append(Constant.ACCEPT);
dataToSign.append("\n").append("X-Qiniu-Date").append(": ").append(signDate);
dataToSign.append("\n\n");
if (ObjectUtil.isNotEmpty(body)) {
dataToSign.append(body);
}
HMac hMac = new HMac(HmacAlgorithm.HmacSHA1, qiNiuConfig.getAccessKeySecret().getBytes(StandardCharsets.UTF_8));
byte[] signData = hMac.digest(dataToSign.toString().getBytes(StandardCharsets.UTF_8));
String encodedSignature = Base64.getEncoder().encodeToString(signData);
return "Qiniu " + qiNiuConfig.getAccessKeyId() + ":" + encodedSignature;
}
public static Map<String, String> getHeaderAndSign(String url, HashMap<String, Object> hashMap, QiNiuConfig qiNiuConfig) {
String signature;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String signDate = dateFormat.format(new Date());
try {
signature = getSignature("POST", url, qiNiuConfig, JSONUtil.toJsonStr(hashMap), signDate);
} catch (Exception e) {
log.error("签名失败", e);
throw new SmsBlendException(e.getMessage());
}
//请求头
Map<String, String> header = new HashMap<>(3);
header.put("Authorization", signature);
header.put("X-Qiniu-Date", signDate);
header.put("Content-Type", "application/json");
return header;
}
}

View File

@ -54,14 +54,14 @@ public class TencentSmsImpl extends AbstractSmsBlend<TencentConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
List<String> list = new ArrayList<>();
for (Map.Entry<String, String> entry : messages.entrySet()) {
list.add(entry.getValue());
@ -82,6 +82,9 @@ public class TencentSmsImpl extends AbstractSmsBlend<TencentConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
List<String> list = new ArrayList<>();
for (Map.Entry<String, String> entry : messages.entrySet()) {
list.add(entry.getValue());
@ -123,7 +126,7 @@ public class TencentSmsImpl extends AbstractSmsBlend<TencentConfig> {
private SmsResponse requestRetry(String[] phones, String[] messages, String templateId) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponse(phones, messages, templateId);
}

View File

@ -8,7 +8,7 @@ public class Uni {
/** 模仿SDK版本*/
public static final String VERSION = "0.0.4";
public static String signingAlgorithm = "hmac-sha256";
public static final String signingAlgorithm = "hmac-sha256";
public static String endpoint = System.getenv().getOrDefault("UNI_ENDPOINT", "https://uni.apistd.com");
public static String accessKeyId = System.getenv("UNI_ACCESS_KEY_ID");

View File

@ -9,7 +9,6 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.comm.utils.SmsHttpUtils;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@ -67,7 +66,7 @@ public class UniClient {
private Map<String, Object> sign(final Map<String, Object> query) {
if (this.accessKeySecret != null) {
query.put("algorithm", this.signingAlgorithm);
query.put("timestamp", new Date().getTime());
query.put("timestamp", System.currentTimeMillis());
query.put("nonce", UUID.randomUUID().toString().replaceAll("-", ""));
String strToSign = UniClient.queryStringify(query);
@ -114,12 +113,12 @@ public class UniClient {
private UniResponse requestRetry(String action, Map<String, Object> data) {
http.safeSleep(retryInterval);
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return request(action, data);
}
public static class Builder {
private String accessKeyId;
private final String accessKeyId;
private String accessKeySecret;
private String endpoint;
private String signingAlgorithm;

View File

@ -81,6 +81,9 @@ public class UniSmsImpl extends AbstractSmsBlend<UniConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
if (phones.size() > 1000) {
throw new SmsBlendException("单次发送超过最大发送上限建议每次群发短信人数低于1000");
}

View File

@ -74,7 +74,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@ -82,12 +82,15 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
private SmsResponse requestRetry(String phone, String message) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return sendMessage(phone, message);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
Map<String, Object> body = setBody(phone, "", messages, templateId);
Map<String, String> headers = getHeaders();
@ -107,7 +110,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
private SmsResponse requestRetry(String phone, String templateId, LinkedHashMap<String, String> messages) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return sendMessage(phone, templateId, messages);
}
@ -121,6 +124,9 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
if (phones.size() > 1000) {
throw new SmsBlendException("单次发送超过最大发送上限建议每次群发短信人数低于1000");
}

View File

@ -71,13 +71,16 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<String, String>();
messages = new LinkedHashMap<>();
}
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
return getSmsResponseTemplate(templateId, phone, messages);
}
@ -96,6 +99,9 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
if (Objects.isNull(messages)){
messages = new LinkedHashMap<>();
}
return getSmsResponseTemplate(templateId, phones, messages);
}
@ -160,7 +166,7 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
private SmsResponse requestRetry(List<String> phones, String content) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponse(phones, content);
}
@ -248,7 +254,7 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
private SmsResponse requestRetry(String templateId, List<String> phones, LinkedHashMap<String, String> messages) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponseTemplate(templateId, phones, messages);
}

View File

@ -10,10 +10,14 @@ import org.dromara.sms4j.api.universal.SupplierConfig;
import org.dromara.sms4j.cloopen.config.CloopenFactory;
import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.processor.*;
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
import org.dromara.sms4j.core.proxy.processor.BlackListProcessor;
import org.dromara.sms4j.core.proxy.processor.BlackListRecordingProcessor;
import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor;
import org.dromara.sms4j.core.proxy.processor.RestrictedProcessor;
import org.dromara.sms4j.core.proxy.processor.SingleBlendRestrictedProcessor;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
@ -37,7 +41,7 @@ import java.util.Map;
@Slf4j
public class SmsBlendsInitializer {
private List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
private final List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
private final SmsConfig smsConfig;
private final Map<String, Map<String, Object>> blends;

View File

@ -104,7 +104,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend<ZhangJunConfig> {
private SmsResponse requestRetry(String phone, String message, String templateId) {
http.safeSleep(getConfig().getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
log.warn("短信第 {} 次重新发送", retry);
return getSmsResponse(phone, message, templateId);
}

View File

@ -79,13 +79,20 @@ sms:
access-key-secret: 你的Access Key Secret
sdkAppId: 你的应用ID
#自定义广州掌骏短信添加factory全路径。config,factory,SmsImpl复制其他默认实现即可修改对应的supplier和发送核心逻辑即可
zhangjun:
supplier: zhangjun
factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory
templateId: d2a****777
appId: 64c52d2a****77775fe72e3
sid: d2a****777
url: https://sms.idowe.com/**/**/**/send
# zhangjun:
# supplier: zhangjun
# factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory
# templateId: d2a****777
# appId: 64c52d2a****77775fe72e3
# sid: d2a****777
# url: https://sms.idowe.com/**/**/**/send
qiniu:
access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2
access-key-secret: NeS2ptvZQoIy*****err2DdLe7wxFfQvji1
templateId: 1752130****15859456
signatureId: 175185*****1624960
templateName: code
sms-oa:
config-type: yaml
oas:

View File

@ -106,7 +106,7 @@ public class SmsProcessorTest {
Assert.notNull(knowEx);
knowEx = null;
try {
SmsFactory.getBySupplier(SupplierConstant.UNISMS).massTexting(new ArrayList<String>(), "321321");
SmsFactory.getBySupplier(SupplierConstant.UNISMS).massTexting(new ArrayList<>(), "321321");
} catch (SmsBlendException e) {
knowEx = e;
System.out.println(knowEx.getMessage());

View File

@ -4,9 +4,14 @@ import cn.hutool.core.bean.BeanUtil;
import org.dromara.sms4j.core.datainterface.SmsReadConfig;
import org.dromara.sms4j.provider.config.BaseConfig;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ConfigCombineMapAdeptor<S, M> extends HashMap {
@Override
public M get(Object key) {
Object o = super.get(key);
if (null == o){

View File

@ -12,10 +12,14 @@ import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.enumerate.ConfigType;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.core.datainterface.SmsReadConfig;
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.processor.*;
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
import org.dromara.sms4j.core.proxy.processor.BlackListProcessor;
import org.dromara.sms4j.core.proxy.processor.BlackListRecordingProcessor;
import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor;
import org.dromara.sms4j.core.proxy.processor.RestrictedProcessor;
import org.dromara.sms4j.core.proxy.processor.SingleBlendRestrictedProcessor;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
@ -26,6 +30,7 @@ import org.dromara.sms4j.netease.config.NeteaseFactory;
import org.dromara.sms4j.provider.config.SmsConfig;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
import org.dromara.sms4j.qiniu.config.QiNiuFactory;
import org.dromara.sms4j.starter.adepter.ConfigCombineMapAdeptor;
import org.dromara.sms4j.tencent.config.TencentFactory;
import org.dromara.sms4j.unisms.config.UniFactory;
@ -40,7 +45,7 @@ import java.util.Map;
@Slf4j
public class SmsBlendsInitializer {
private List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
private final List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
private final SmsConfig smsConfig;
private final Map<String, Map<String, Object>> blends;
@ -119,9 +124,11 @@ public class SmsBlendsInitializer {
ProviderFactoryHolder.registerFactory(ZhutongFactory.instance());
ProviderFactoryHolder.registerFactory(LianLuFactory.instance());
ProviderFactoryHolder.registerFactory(DingZhongFactory.instance());
ProviderFactoryHolder.registerFactory(QiNiuFactory.instance());
if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) {
ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
}
log.debug("加载内置运营商完成!");
}
}

View File

@ -30,24 +30,6 @@ public class SmsMainConfig {
return BeanFactory.getSmsConfig();
}
// /**
// * 注入一个定时器
// */
// @Bean
// @Lazy
// protected DelayedTime delayedTime() {
// return BeanFactory.getDelayedTime();
// }
//
// /**
// * 注入线程池
// */
// @Bean("smsExecutor")
// @Lazy
// protected Executor taskExecutor(SmsConfig config) {
// return BeanFactory.setExecutor(config);
// }
/**
* 注入一个配置文件读取工具
*/

View File

@ -1,8 +1,6 @@
package org.dromara.sms4j.starter.holder;
import org.dromara.sms4j.api.dao.SmsDao;
import org.dromara.sms4j.api.dao.SmsDaoDefaultImpl;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.starter.utils.SmsSpringUtils;
public class SpringSmsDaoHolder {

View File

@ -1,5 +1,6 @@
package org.dromara.sms4j.starter.utils;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
@ -19,6 +20,7 @@ import java.util.Map;
@Slf4j
public class SmsSpringUtils implements ApplicationContextAware {
@Getter
private static ApplicationContext applicationContext;
private final DefaultListableBeanFactory beanFactory;
@ -27,10 +29,6 @@ public class SmsSpringUtils implements ApplicationContextAware {
this.beanFactory = beanFactory;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SmsSpringUtils.applicationContext == null) {