diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/config/BaseConfig.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/config/BaseConfig.java index 4c3ddbbc..bc652878 100644 --- a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/config/BaseConfig.java +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/config/BaseConfig.java @@ -1,5 +1,6 @@ package org.dromara.sms4j.comm.config; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -34,4 +35,10 @@ public class BaseConfig { * 模板 ID */ private String templateId; + + /** + * 权重 + * */ + @Builder.Default + private Integer weight = 1; } diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/ReflectUtil.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/ReflectUtil.java new file mode 100644 index 00000000..c32cc7cd --- /dev/null +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/ReflectUtil.java @@ -0,0 +1,36 @@ +package org.dromara.sms4j.core; + +import org.dromara.sms4j.api.universal.SupplierConfig; +import org.dromara.sms4j.comm.exception.SmsBlendException; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +public class ReflectUtil { + + /** + * 反射获取接口对象的原类名 + */ + public static String getObjectName(SupplierConfig parameter) { + return parameter.getClass().getTypeName(); + } + + /** + * 将对象的属性和属性值变为map + * */ + public static Map getValues(SupplierConfig parameter) { + try { + Map map = new HashMap<>(); + Class clazz = Class.forName(getObjectName(parameter)); + Field[] declaredFields = clazz.getDeclaredFields(); + for (Field declaredField : declaredFields) { + declaredField.setAccessible(true); + map.put(declaredField.getName(), (String) declaredField.get(parameter)); + } + return map; + } catch (Exception e) { + throw new SmsBlendException(e.toString()); + } + } +} diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/config/SupplierFactory.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/config/SupplierFactory.java index 66615b1a..9ae0c2df 100644 --- a/sms4j-core/src/main/java/org/dromara/sms4j/core/config/SupplierFactory.java +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/config/SupplierFactory.java @@ -7,6 +7,7 @@ import org.dromara.sms4j.cloopen.config.CloopenConfig; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.core.load.SmsLoad; import org.dromara.sms4j.ctyun.config.CtyunConfig; import org.dromara.sms4j.ctyun.config.CtyunFactory; import org.dromara.sms4j.emay.config.EmayConfig; @@ -141,6 +142,8 @@ public class SupplierFactory { setCtyunConfig((CtyunConfig) t); } else if (t instanceof NeteaseConfig) { setNeteaseConfig((NeteaseConfig) t); + } else if (t instanceof ZhutongConfig) { + setZhuTongConfig((ZhutongConfig) t); } else { throw new SmsBlendException("Loading failure! Please check the configuration type."); } @@ -152,6 +155,7 @@ public class SupplierFactory { public static void setAlibabaConfig(AlibabaConfig alibabaConfig) { AlibabaFactory.instance().setConfig(alibabaConfig); SmsFactory.refresh(SupplierType.ALIBABA); + SmsLoad.starConfig(alibabaConfig,SupplierType.ALIBABA); } /** @@ -160,6 +164,7 @@ public class SupplierFactory { public static void setHuaweiConfig(HuaweiConfig huaweiConfig) { HuaweiFactory.instance().setConfig(huaweiConfig); SmsFactory.refresh(SupplierType.HUAWEI); + SmsLoad.starConfig(huaweiConfig,SupplierType.HUAWEI); } /** @@ -168,6 +173,7 @@ public class SupplierFactory { public static void setUniConfig(UniConfig uniConfig) { UniFactory.instance().setConfig(uniConfig); SmsFactory.refresh(SupplierType.UNI_SMS); + SmsLoad.starConfig(uniConfig,SupplierType.UNI_SMS); } /** @@ -176,6 +182,7 @@ public class SupplierFactory { public static void setTencentConfig(TencentConfig tencentConfig) { TencentFactory.instance().setConfig(tencentConfig); SmsFactory.refresh(SupplierType.TENCENT); + SmsLoad.starConfig(tencentConfig,SupplierType.TENCENT); } /** @@ -184,6 +191,7 @@ public class SupplierFactory { public static void setYunpianConfig(YunpianConfig yunpianConfig) { YunPianFactory.instance().setConfig(yunpianConfig); SmsFactory.refresh(SupplierType.YUNPIAN); + SmsLoad.starConfig(yunpianConfig,SupplierType.YUNPIAN); } /** @@ -192,6 +200,7 @@ public class SupplierFactory { public static void setJdCloudConfig(JdCloudConfig jdCloudConfig) { JdCloudFactory.instance().setConfig(jdCloudConfig); SmsFactory.refresh(SupplierType.JD_CLOUD); + SmsLoad.starConfig(jdCloudConfig,SupplierType.JD_CLOUD); } /** @@ -200,6 +209,7 @@ public class SupplierFactory { public static void setCloopenConfig(CloopenConfig cloopenConfig) { CloopenFactory.instance().setConfig(cloopenConfig); SmsFactory.refresh(SupplierType.CLOOPEN); + SmsLoad.starConfig(cloopenConfig,SupplierType.CLOOPEN); } /** @@ -208,6 +218,7 @@ public class SupplierFactory { public static void setEmayConfig(EmayConfig emayConfig) { EmayFactory.instance().setConfig(emayConfig); SmsFactory.refresh(SupplierType.EMAY); + SmsLoad.starConfig(emayConfig,SupplierType.EMAY); } /** @@ -216,6 +227,7 @@ public class SupplierFactory { public static void setCtyunConfig(CtyunConfig ctyunConfig) { CtyunFactory.instance().setConfig(ctyunConfig); SmsFactory.refresh(SupplierType.CTYUN); + SmsLoad.starConfig(ctyunConfig,SupplierType.CTYUN); } /** @@ -224,5 +236,12 @@ public class SupplierFactory { public static void setNeteaseConfig(NeteaseConfig neteaseConfig) { NeteaseFactory.instance().setConfig(neteaseConfig); SmsFactory.refresh(SupplierType.NETEASE); + SmsLoad.starConfig(neteaseConfig,SupplierType.NETEASE); + } + + public static void setZhuTongConfig(ZhutongConfig zhutongConfig){ + ZhutongFactory.instance().setConfig(zhutongConfig); + SmsFactory.refresh(SupplierType.ZHUTONG); + SmsLoad.starConfig(zhutongConfig,SupplierType.ZHUTONG); } } diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java index 362c2148..aa7a9d97 100644 --- a/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java @@ -1,9 +1,17 @@ package org.dromara.sms4j.core.load; import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.universal.SupplierConfig; +import org.dromara.sms4j.comm.config.BaseConfig; +import org.dromara.sms4j.core.ReflectUtil; +import org.dromara.sms4j.core.config.SupplierFactory; +import org.dromara.sms4j.provider.base.BaseProviderFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * SmsLoad @@ -15,6 +23,9 @@ public class SmsLoad { // 服务器列表,每个服务器有一个权重和当前权重 private static final List LoadServers = new ArrayList<>(); + // 实例列表 + private static final Map smsBlendMap = new HashMap<>(); + private SmsLoad() { } @@ -51,7 +62,7 @@ public class SmsLoad { * @return SmsBlend 短信实现 * @author :Wind */ - public static SmsBlend getLoadServer() { + public synchronized static SmsBlend getLoadServer() { int totalWeight = 0; LoadServer selectedLoadServer = null; // 计算所有服务器的权重总和,并选择当前权重最大的服务器 @@ -72,5 +83,18 @@ public class SmsLoad { selectedLoadServer.setCurrentWeight(i); return selectedLoadServer.getSmsServer(); } + + /** + * starConfig + *

创建smsBlend并加入到负载均衡器 + * @param supplierConfig 厂商配置 + * @param supplierType 厂商枚举 + * @author :Wind + */ + public static void starConfig(SupplierConfig supplierConfig, SupplierType supplierType){ + BaseProviderFactory providerFactory = supplierType.getProviderFactory(); + SmsBlend smsBlend = providerFactory.createMultitonSms(supplierConfig); + addLoadServer(smsBlend, Integer.parseInt(ReflectUtil.getValues(supplierConfig).get("weight"))); + } } diff --git a/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java b/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java index bf05eede..b16475c5 100644 --- a/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java +++ b/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java @@ -17,9 +17,11 @@ import org.dromara.sms4j.emay.config.EmayConfig; import org.dromara.sms4j.huawei.config.HuaweiConfig; import org.dromara.sms4j.javase.util.YamlUtil; import org.dromara.sms4j.jdcloud.config.JdCloudConfig; +import org.dromara.sms4j.netease.config.NeteaseConfig; import org.dromara.sms4j.tencent.config.TencentConfig; import org.dromara.sms4j.unisms.config.UniConfig; import org.dromara.sms4j.yunpian.config.YunpianConfig; +import org.dromara.sms4j.zhutong.config.ZhutongConfig; /** * 初始化类 @@ -35,6 +37,7 @@ public class SEInitializer { /** * 初始化短信公共配置 + * * @param smsConfig 短信公共配置 * @return 当前初始化类实例 */ @@ -45,6 +48,7 @@ public class SEInitializer { /** * 初始化阿里配置 + * * @param alibabaConfig 阿里配置 * @return 当前初始化类实例 */ @@ -55,6 +59,7 @@ public class SEInitializer { /** * 初始化容连云配置 + * * @param cloopenConfig 容连云配置 * @return 当前初始化类实例 */ @@ -65,6 +70,7 @@ public class SEInitializer { /** * 初始化亿美软通配置 + * * @param emayConfig 亿美软通配置 * @return 当前初始化类实例 */ @@ -75,6 +81,7 @@ public class SEInitializer { /** * 初始化华为配置 + * * @param huaweiConfig 华为配置 * @return 当前初始化类实例 */ @@ -85,6 +92,7 @@ public class SEInitializer { /** * 初始化京东配置 + * * @param jdCloudConfig 京东配置 * @return 当前初始化类实例 */ @@ -95,6 +103,7 @@ public class SEInitializer { /** * 初始化腾讯配置 + * * @param tencentConfig 腾讯配置 * @return 当前初始化类实例 */ @@ -105,6 +114,7 @@ public class SEInitializer { /** * 初始化合一配置 + * * @param uniConfig 合一配置 * @return 当前初始化类实例 */ @@ -115,6 +125,7 @@ public class SEInitializer { /** * 初始化云片配置 + * * @param yunpianConfig 云片配置 * @return 当前初始化类实例 */ @@ -123,8 +134,33 @@ public class SEInitializer { return this; } + /** + * initializer + *

初始化网易云短信配置 + * + * @return 当前初始化类实例 + * @author :Wind + */ + public SEInitializer initNetase(NeteaseConfig neteaseConfig) { + BeanUtil.copyProperties(neteaseConfig, SupplierFactory.getNeteaseConfig()); + return this; + } + + /** + * initZhuTong + *

初始化助通短信配置 + * + * @return 当前初始化类实例 + * @author :Wind + */ + public SEInitializer initZhuTong(ZhutongConfig zhutongConfig) { + BeanUtil.copyProperties(zhutongConfig, SupplierFactory.getZhutongConfig()); + return this; + } + /** * 默认从sms-aggregation.yml文件中读取配置 + * * @return */ public void fromYaml() { @@ -134,6 +170,7 @@ public class SEInitializer { /** * 从yaml中读取配置 + * * @param yaml yaml配置字符串 */ public void fromYaml(String yaml) { @@ -143,6 +180,7 @@ public class SEInitializer { /** * 从json中读取配置 + * * @param json json配置字符串 */ public void fromJson(String json) { @@ -151,49 +189,57 @@ public class SEInitializer { } private void initConfig(InitConfig config) { - if(config == null) { + if (config == null) { log.error("初始化配置失败"); throw new SmsBlendException("初始化配置失败"); } InitSmsConfig smsConfig = config.getSms(); - if(smsConfig == null) { + if (smsConfig == null) { log.error("初始化配置失败"); throw new SmsBlendException("初始化配置失败"); } this.initSmsConfig(smsConfig); AlibabaConfig alibabaConfig = smsConfig.getAlibaba(); - if(alibabaConfig != null) { + if (alibabaConfig != null) { this.initAlibaba(alibabaConfig); } CloopenConfig cloopenConfig = smsConfig.getCloopen(); - if(cloopenConfig != null) { + if (cloopenConfig != null) { this.initCloopen(cloopenConfig); } EmayConfig emayConfig = smsConfig.getEmay(); - if(emayConfig != null) { + if (emayConfig != null) { this.initEmay(emayConfig); } HuaweiConfig huaweiConfig = smsConfig.getHuawei(); - if(huaweiConfig != null) { + if (huaweiConfig != null) { this.initHuawei(huaweiConfig); } JdCloudConfig jdCloudConfig = smsConfig.getJdCloud(); - if(jdCloudConfig != null) { + if (jdCloudConfig != null) { this.initJdCloud(jdCloudConfig); } TencentConfig tencentConfig = smsConfig.getTencent(); - if(tencentConfig != null) { + if (tencentConfig != null) { this.initTencent(tencentConfig); } UniConfig uniConfig = smsConfig.getUni(); - if(uniConfig != null) { + if (uniConfig != null) { this.initUniSms(uniConfig); } YunpianConfig yunpianConfig = smsConfig.getYunpian(); - if(yunpianConfig != null) { + if (yunpianConfig != null) { this.initYunpian(yunpianConfig); } + NeteaseConfig neteaseConfig = smsConfig.getNeteaseConfig(); + if (neteaseConfig != null){ + this.initNetase(neteaseConfig); + } + ZhutongConfig zhutongConfig = smsConfig.getZhutongConfig(); + if (zhutongConfig != null){ + this.initZhuTong(zhutongConfig); + } } /** @@ -221,6 +267,8 @@ public class SEInitializer { private TencentConfig tencent; private UniConfig uni; private YunpianConfig yunpian; + private NeteaseConfig neteaseConfig; + private ZhutongConfig zhutongConfig; } } diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java index b743f040..9e0c6428 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java @@ -12,15 +12,19 @@ import org.dromara.sms4j.tencent.config.TencentConfig; import org.dromara.sms4j.unisms.config.UniConfig; import org.dromara.sms4j.yunpian.config.YunpianConfig; import org.dromara.sms4j.zhutong.config.ZhutongConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; +import javax.annotation.PostConstruct; + public class SupplierConfig { /** 阿里差异化配置*/ @Bean @ConfigurationProperties(prefix = "sms.alibaba") + @ConditionalOnProperty(prefix = "sms", name = "alibaba") protected AlibabaConfig alibabaConfig(){ return SupplierFactory.getAlibabaConfig(); } @@ -28,6 +32,7 @@ public class SupplierConfig { /** 华为差异化配置*/ @Bean @ConfigurationProperties(prefix = "sms.huawei") + @ConditionalOnProperty(prefix = "sms", name = "huawei") protected HuaweiConfig huaweiConfig(){ return SupplierFactory.getHuaweiConfig(); } @@ -35,6 +40,7 @@ public class SupplierConfig { /** 云片短信差异化配置*/ @Bean @ConfigurationProperties(prefix = "sms.yunpian") + @ConditionalOnProperty(prefix = "sms", name = "yunpian") protected YunpianConfig yunpianConfig(){ return SupplierFactory.getYunpianConfig(); } @@ -42,6 +48,7 @@ public class SupplierConfig { /** 合一短信差异化配置*/ @Bean @ConfigurationProperties(prefix = "sms.uni") + @ConditionalOnProperty(prefix = "sms", name = "uni") protected UniConfig uniConfig(){ return SupplierFactory.getUniConfig(); } @@ -49,6 +56,7 @@ public class SupplierConfig { /** 腾讯短信差异化配置*/ @Bean @ConfigurationProperties(prefix = "sms.tencent") + @ConditionalOnProperty(prefix = "sms", name = "tencent") protected TencentConfig tencentConfig(){ return SupplierFactory.getTencentConfig(); } @@ -56,6 +64,7 @@ public class SupplierConfig { /** 京东云短信差异化配置 */ @Bean @ConfigurationProperties(prefix = "sms.jdcloud") + @ConditionalOnProperty(prefix = "sms", name = "jdcloud") protected JdCloudConfig jdCloudConfig(){ return SupplierFactory.getJdCloudConfig(); } @@ -63,6 +72,7 @@ public class SupplierConfig { /** 容联云短信差异化配置 */ @Bean @ConfigurationProperties(prefix = "sms.cloopen") + @ConditionalOnProperty(prefix = "sms", name = "cloopen") protected CloopenConfig cloopenConfig(){ return SupplierFactory.getCloopenConfig(); } @@ -72,6 +82,7 @@ public class SupplierConfig { */ @Bean @ConfigurationProperties(prefix = "sms.emay") + @ConditionalOnProperty(prefix = "sms", name = "emay") protected EmayConfig emayConfig(){ return SupplierFactory.getEmayConfig(); } @@ -81,6 +92,7 @@ public class SupplierConfig { */ @Bean @ConfigurationProperties(prefix = "sms.ctyun") + @ConditionalOnProperty(prefix = "sms", name = "ctyun") protected CtyunConfig ctyunConfig(){ return SupplierFactory.getCtyunConfig(); } @@ -91,6 +103,7 @@ public class SupplierConfig { */ @Bean @ConfigurationProperties(prefix = "sms.netease") + @ConditionalOnProperty(prefix = "sms", name = "netease") protected NeteaseConfig neteaseConfig(){ return SupplierFactory.getNeteaseConfig(); } @@ -100,7 +113,13 @@ public class SupplierConfig { */ @Bean @ConfigurationProperties(prefix = "sms.zhutong") + @ConditionalOnProperty(prefix = "sms", name = "zhutong") protected ZhutongConfig zhutongConfig(){ return SupplierFactory.getZhutongConfig(); } + + @PostConstruct + protected void init(){ + + } } diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/utils/SmsSpringUtil.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/utils/SmsSpringUtil.java index 71dc5f01..50989b82 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/utils/SmsSpringUtil.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/utils/SmsSpringUtil.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import java.util.Map; + /** *

类名: SmsSpringUtil *

说明:spring bean工具 @@ -99,4 +101,8 @@ public class SmsSpringUtil implements ApplicationContextAware { public static boolean interfaceExist(ClassinterfaceType) { return !applicationContext.getBeansOfType(interfaceType).isEmpty(); } + + public Map getBeansOfType(Class interfaceType) { + return applicationContext.getBeansOfType(interfaceType); + } }