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

添加: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.comm.factory.BeanFactory;
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.enumerate.SupplierType;
@ -53,6 +54,15 @@ public abstract class SmsFactory {
return providerFactory.createMultitonSms(config);
}
/**
* createSmsBlend
* <p>获取负载均衡器中的短信实例
* @author :Wind
*/
public static SmsBlend createSmsBlend(){
return SmsLoad.getBeanLoad().getLoadServer();
}
/**
* refresh
* <p>刷新配置用于切换配置后的刷新防止因厂商sdk内部的保存导致配置更新不及时

View File

@ -21,14 +21,20 @@ import java.util.Map;
**/
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 SmsLoad smsLoad = new SmsLoad();
private SmsLoad() {
}
public static SmsLoad newSmsLoad() {
return new SmsLoad();
}
/**
* addLoadServer
* <p> 添加服务及其权重
@ -37,7 +43,7 @@ public class SmsLoad {
* @param weight 权重
* @author :Wind
*/
public static void addLoadServer(SmsBlend LoadServer, int weight) {
public void addLoadServer(SmsBlend LoadServer, int weight) {
LoadServers.add(new LoadServer(LoadServer, weight, weight));
}
@ -47,7 +53,7 @@ public class SmsLoad {
* @param LoadServer 要移除的服务
* @author :Wind
*/
public static void removeLoadServer(SmsBlend LoadServer) {
public void removeLoadServer(SmsBlend LoadServer) {
for (int i = 0; i < LoadServers.size(); i++) {
if (LoadServers.get(i).getSmsServer().equals(LoadServer)) {
LoadServers.remove(i);
@ -62,7 +68,7 @@ public class SmsLoad {
* @return SmsBlend 短信实现
* @author :Wind
*/
public synchronized static SmsBlend getLoadServer() {
public synchronized SmsBlend getLoadServer() {
int totalWeight = 0;
LoadServer selectedLoadServer = null;
// 计算所有服务器的权重总和并选择当前权重最大的服务器
@ -94,7 +100,11 @@ public class SmsLoad {
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")));
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.factory.BeanFactory;
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.utils.ConfigUtil;
import org.dromara.sms4j.starter.utils.SmsRedisUtils;
@ -25,6 +26,7 @@ import org.springframework.data.redis.connection.RedisConnectionFactory;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.Executor;
@ -95,6 +97,11 @@ public class SmsAutowiredConfig {
SmsInvocationHandler.setRestrictedProcess(new RestrictedProcessImpl());
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
if (BeanFactory.getSmsConfig().getIsPrint()){
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.jdcloud.config.JdCloudConfig;
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.unisms.config.UniConfig;
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 javax.annotation.PostConstruct;
import java.util.Map;
public class SupplierConfig {
@ -117,9 +119,4 @@ public class SupplierConfig {
protected ZhutongConfig zhutongConfig(){
return SupplierFactory.getZhutongConfig();
}
@PostConstruct
protected void init(){
}
}

View File

@ -102,7 +102,7 @@ public class SmsSpringUtil implements ApplicationContextAware {
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);
}
}