修改:负载均衡器可存在多个

添加:spring模式下bean注入后则设置到配置工厂,并添加至负载均衡器
This commit is contained in:
wind 2023-07-06 23:33:32 +08:00
parent 61336f3145
commit 61d99e47c5
5 changed files with 35 additions and 11 deletions

View File

@ -5,6 +5,7 @@ import org.dromara.sms4j.api.smsProxy.SmsInvocationHandler;
import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.api.universal.SupplierConfig;
import org.dromara.sms4j.comm.factory.BeanFactory; import org.dromara.sms4j.comm.factory.BeanFactory;
import org.dromara.sms4j.core.SupplierSqlConfig; import org.dromara.sms4j.core.SupplierSqlConfig;
import org.dromara.sms4j.core.load.SmsLoad;
import org.dromara.sms4j.provider.base.BaseProviderFactory; import org.dromara.sms4j.provider.base.BaseProviderFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType; import org.dromara.sms4j.provider.enumerate.SupplierType;
@ -53,6 +54,15 @@ public abstract class SmsFactory {
return providerFactory.createMultitonSms(config); return providerFactory.createMultitonSms(config);
} }
/**
* createSmsBlend
* <p>获取负载均衡器中的短信实例
* @author :Wind
*/
public static SmsBlend createSmsBlend(){
return SmsLoad.getBeanLoad().getLoadServer();
}
/** /**
* refresh * refresh
* <p>刷新配置用于切换配置后的刷新防止因厂商sdk内部的保存导致配置更新不及时 * <p>刷新配置用于切换配置后的刷新防止因厂商sdk内部的保存导致配置更新不及时

View File

@ -21,14 +21,20 @@ import java.util.Map;
**/ **/
public class SmsLoad { public class SmsLoad {
// 服务器列表每个服务器有一个权重和当前权重 // 服务器列表每个服务器有一个权重和当前权重
private static final List<LoadServer> LoadServers = new ArrayList<>(); private final List<LoadServer> LoadServers = new ArrayList<>();
// 实例列表 // 实例列表
private static final Map<Object, SmsBlend> smsBlendMap = new HashMap<>(); private static final Map<Object, SmsBlend> smsBlendMap = new HashMap<>();
private static final SmsLoad smsLoad = new SmsLoad();
private SmsLoad() { private SmsLoad() {
} }
public static SmsLoad newSmsLoad() {
return new SmsLoad();
}
/** /**
* addLoadServer * addLoadServer
* <p> 添加服务及其权重 * <p> 添加服务及其权重
@ -37,7 +43,7 @@ public class SmsLoad {
* @param weight 权重 * @param weight 权重
* @author :Wind * @author :Wind
*/ */
public static void addLoadServer(SmsBlend LoadServer, int weight) { public void addLoadServer(SmsBlend LoadServer, int weight) {
LoadServers.add(new LoadServer(LoadServer, weight, weight)); LoadServers.add(new LoadServer(LoadServer, weight, weight));
} }
@ -47,7 +53,7 @@ public class SmsLoad {
* @param LoadServer 要移除的服务 * @param LoadServer 要移除的服务
* @author :Wind * @author :Wind
*/ */
public static void removeLoadServer(SmsBlend LoadServer) { public void removeLoadServer(SmsBlend LoadServer) {
for (int i = 0; i < LoadServers.size(); i++) { for (int i = 0; i < LoadServers.size(); i++) {
if (LoadServers.get(i).getSmsServer().equals(LoadServer)) { if (LoadServers.get(i).getSmsServer().equals(LoadServer)) {
LoadServers.remove(i); LoadServers.remove(i);
@ -62,7 +68,7 @@ public class SmsLoad {
* @return SmsBlend 短信实现 * @return SmsBlend 短信实现
* @author :Wind * @author :Wind
*/ */
public synchronized static SmsBlend getLoadServer() { public synchronized SmsBlend getLoadServer() {
int totalWeight = 0; int totalWeight = 0;
LoadServer selectedLoadServer = null; LoadServer selectedLoadServer = null;
// 计算所有服务器的权重总和并选择当前权重最大的服务器 // 计算所有服务器的权重总和并选择当前权重最大的服务器
@ -94,7 +100,11 @@ public class SmsLoad {
public static void starConfig(SupplierConfig supplierConfig, SupplierType supplierType){ public static void starConfig(SupplierConfig supplierConfig, SupplierType supplierType){
BaseProviderFactory providerFactory = supplierType.getProviderFactory(); BaseProviderFactory providerFactory = supplierType.getProviderFactory();
SmsBlend smsBlend = providerFactory.createMultitonSms(supplierConfig); SmsBlend smsBlend = providerFactory.createMultitonSms(supplierConfig);
addLoadServer(smsBlend, Integer.parseInt(ReflectUtil.getValues(supplierConfig).get("weight"))); smsLoad.addLoadServer(smsBlend, Integer.parseInt(ReflectUtil.getValues(supplierConfig).get("weight")));
}
public static SmsLoad getBeanLoad(){
return smsLoad;
} }
} }

View File

@ -10,6 +10,7 @@ import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.delayedTime.DelayedTime; import org.dromara.sms4j.comm.delayedTime.DelayedTime;
import org.dromara.sms4j.comm.factory.BeanFactory; import org.dromara.sms4j.comm.factory.BeanFactory;
import org.dromara.sms4j.core.SupplierSqlConfig; import org.dromara.sms4j.core.SupplierSqlConfig;
import org.dromara.sms4j.core.config.SupplierFactory;
import org.dromara.sms4j.starter.aop.RestrictedProcessImpl; import org.dromara.sms4j.starter.aop.RestrictedProcessImpl;
import org.dromara.sms4j.starter.utils.ConfigUtil; import org.dromara.sms4j.starter.utils.ConfigUtil;
import org.dromara.sms4j.starter.utils.SmsRedisUtils; import org.dromara.sms4j.starter.utils.SmsRedisUtils;
@ -25,6 +26,7 @@ import org.springframework.data.redis.connection.RedisConnectionFactory;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@ -95,6 +97,11 @@ public class SmsAutowiredConfig {
SmsInvocationHandler.setRestrictedProcess(new RestrictedProcessImpl()); SmsInvocationHandler.setRestrictedProcess(new RestrictedProcessImpl());
log.debug("The redis cache is enabled for sms4j"); log.debug("The redis cache is enabled for sms4j");
} }
// 将spring中存在的所有配置设置到配置工厂并添加至负载均衡器
Map<String, org.dromara.sms4j.api.universal.SupplierConfig> beansOfType = SmsSpringUtil.getBeansOfType(org.dromara.sms4j.api.universal.SupplierConfig.class);
for (org.dromara.sms4j.api.universal.SupplierConfig s : beansOfType.values()) {
SupplierFactory.setSupplierConfig(s);
}
//打印banner //打印banner
if (BeanFactory.getSmsConfig().getIsPrint()){ if (BeanFactory.getSmsConfig().getIsPrint()){
SmsBanner.PrintBanner(Constant.VERSION); SmsBanner.PrintBanner(Constant.VERSION);

View File

@ -8,6 +8,7 @@ import org.dromara.sms4j.emay.config.EmayConfig;
import org.dromara.sms4j.huawei.config.HuaweiConfig; import org.dromara.sms4j.huawei.config.HuaweiConfig;
import org.dromara.sms4j.jdcloud.config.JdCloudConfig; import org.dromara.sms4j.jdcloud.config.JdCloudConfig;
import org.dromara.sms4j.netease.config.NeteaseConfig; import org.dromara.sms4j.netease.config.NeteaseConfig;
import org.dromara.sms4j.starter.utils.SmsSpringUtil;
import org.dromara.sms4j.tencent.config.TencentConfig; import org.dromara.sms4j.tencent.config.TencentConfig;
import org.dromara.sms4j.unisms.config.UniConfig; import org.dromara.sms4j.unisms.config.UniConfig;
import org.dromara.sms4j.yunpian.config.YunpianConfig; import org.dromara.sms4j.yunpian.config.YunpianConfig;
@ -17,6 +18,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.Map;
public class SupplierConfig { public class SupplierConfig {
@ -117,9 +119,4 @@ public class SupplierConfig {
protected ZhutongConfig zhutongConfig(){ protected ZhutongConfig zhutongConfig(){
return SupplierFactory.getZhutongConfig(); return SupplierFactory.getZhutongConfig();
} }
@PostConstruct
protected void init(){
}
} }

View File

@ -102,7 +102,7 @@ public class SmsSpringUtil implements ApplicationContextAware {
return !applicationContext.getBeansOfType(interfaceType).isEmpty(); return !applicationContext.getBeansOfType(interfaceType).isEmpty();
} }
public <T> Map<String, T> getBeansOfType(Class<T> interfaceType) { public static <T> Map<String, T> getBeansOfType(Class<T> interfaceType) {
return applicationContext.getBeansOfType(interfaceType); return applicationContext.getBeansOfType(interfaceType);
} }
} }