修改solon适配中的错误,去除过时的引用

This commit is contained in:
wind 2023-09-18 23:08:59 +08:00
parent d851aeefd9
commit 31d9173792
11 changed files with 118 additions and 283 deletions

10
pom.xml
View File

@ -54,7 +54,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.boot.version>2.7.12</spring.boot.version> <spring.boot.version>2.7.15</spring.boot.version>
<solon.version>2.5.4</solon.version> <solon.version>2.5.4</solon.version>
<redisson.version>3.17.0</redisson.version> <redisson.version>3.17.0</redisson.version>
<jdcloud.version>1.3.3</jdcloud.version> <jdcloud.version>1.3.3</jdcloud.version>
@ -118,14 +118,6 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring.boot.version}</version>
<scope>provided</scope>
</dependency>
<!-- 京东云短信依赖 --> <!-- 京东云短信依赖 -->
<dependency> <dependency>
<groupId>com.jdcloud.sdk</groupId> <groupId>com.jdcloud.sdk</groupId>

View File

@ -26,18 +26,5 @@
<groupId>org.dromara.sms4j</groupId> <groupId>org.dromara.sms4j</groupId>
<artifactId>sms4j-core</artifactId> <artifactId>sms4j-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>${redisson.version}</version>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-test</artifactId>
<version>${solon.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -0,0 +1,103 @@
package org.dromara.sms4j.solon.config;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.aliyun.config.AlibabaFactory;
import org.dromara.sms4j.api.SmsBlend;
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.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.SmsInvocationHandler;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
import org.dromara.sms4j.huawei.config.HuaweiFactory;
import org.dromara.sms4j.jdcloud.config.JdCloudFactory;
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.solon.aop.SolonRestrictedProcess;
import org.dromara.sms4j.tencent.config.TencentFactory;
import org.dromara.sms4j.unisms.config.UniFactory;
import org.dromara.sms4j.yunpian.config.YunPianFactory;
import org.dromara.sms4j.zhutong.config.ZhutongFactory;
import org.noear.solon.core.AppContext;
import java.util.List;
import java.util.Map;
@Slf4j
public class SmsBlendsInitializer {
private List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
private final SmsConfig smsConfig;
private final Map<String, Map<String, Object>> blends;
private final AppContext context;
public SmsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList,
SmsConfig smsConfig,
Map<String, Map<String, Object>> blends,
AppContext context
){
this.factoryList = factoryList;
this.smsConfig = smsConfig;
this.blends = blends;
this.context = context;
onApplicationEvent();
}
public void onApplicationEvent() {
this.registerDefaultFactory();
// 注册短信对象工厂
ProviderFactoryHolder.registerFactory(factoryList);
// 解析供应商配置
for(String configId : blends.keySet()) {
Map<String, Object> configMap = blends.get(configId);
Object supplierObj = configMap.get(Constant.SUPPLIER_KEY);
String supplier = supplierObj == null ? "" : String.valueOf(supplierObj);
supplier = StrUtil.isEmpty(supplier) ? configId : supplier;
BaseProviderFactory<SmsBlend, SupplierConfig> providerFactory = (BaseProviderFactory<SmsBlend, SupplierConfig>) ProviderFactoryHolder.requireForSupplier(supplier);
if(providerFactory == null) {
log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier);
continue;
}
configMap.put("config-id", configId);
SmsUtils.replaceKeysSeperator(configMap, "-", "_");
JSONObject configJson = new JSONObject(configMap);
SupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass());
if(Boolean.TRUE.equals(smsConfig.getRestricted())) {
SmsFactory.createRestrictedSmsBlend(supplierConfig);
} else {
SmsFactory.createSmsBlend(supplierConfig);
}
}
//注册短信拦截实现
SmsInvocationHandler.setRestrictedProcess(new SolonRestrictedProcess(context));
}
/**
* 注册默认工厂实例
*/
private void registerDefaultFactory() {
ProviderFactoryHolder.registerFactory(AlibabaFactory.instance());
ProviderFactoryHolder.registerFactory(CloopenFactory.instance());
ProviderFactoryHolder.registerFactory(CtyunFactory.instance());
ProviderFactoryHolder.registerFactory(EmayFactory.instance());
ProviderFactoryHolder.registerFactory(HuaweiFactory.instance());
ProviderFactoryHolder.registerFactory(NeteaseFactory.instance());
ProviderFactoryHolder.registerFactory(TencentFactory.instance());
ProviderFactoryHolder.registerFactory(UniFactory.instance());
ProviderFactoryHolder.registerFactory(YunPianFactory.instance());
ProviderFactoryHolder.registerFactory(ZhutongFactory.instance());
if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) {
ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
}
}
}

View File

@ -1,11 +1,15 @@
package org.dromara.sms4j.solon.config; package org.dromara.sms4j.solon.config;
import org.dromara.sms4j.aliyun.config.AlibabaConfig; import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.cloopen.config.CloopenConfig; import org.dromara.sms4j.cloopen.config.CloopenConfig;
import org.dromara.sms4j.ctyun.config.CtyunConfig; import org.dromara.sms4j.ctyun.config.CtyunConfig;
import org.dromara.sms4j.emay.config.EmayConfig; 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.provider.config.SmsConfig;
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
import org.dromara.sms4j.provider.factory.BeanFactory;
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;
@ -15,6 +19,10 @@ import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject; import org.noear.solon.annotation.Inject;
import org.noear.solon.core.AppContext; import org.noear.solon.core.AppContext;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** /**
* smsConfig参数意义为确保注入时smsConfig已经存在 * smsConfig参数意义为确保注入时smsConfig已经存在
*/ */
@ -29,61 +37,16 @@ public class SupplierConfig {
context.cfg().getProp(prefix).bindTo(obj); context.cfg().getProp(prefix).bindTo(obj);
return obj; return obj;
} }
/** 阿里差异化配置*/
@Bean @Bean
public AlibabaConfig alibabaConfig(){ protected Map<String, Map<String, Object>> blends(){
return injectObj("sms.alibaba", new AlibabaConfig()); return injectObj("sms.blends",new LinkedHashMap<>());
} }
/** 华为差异化配置*/
@Bean
public HuaweiConfig huaweiConfig(){
return injectObj("sms.huawei", new HuaweiConfig());
}
/** 云片短信差异化配置*/
@Bean @Bean
public YunpianConfig yunpianConfig(){ protected SmsBlendsInitializer smsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> factoryList,
return injectObj("sms.yunpian", new YunpianConfig()); SmsConfig smsConfig,
} Map<String, Map<String, Object>> blends){
return new SmsBlendsInitializer(factoryList,smsConfig,blends,context);
/** 合一短信差异化配置*/
@Bean
public UniConfig uniConfig(){
return injectObj("sms.uni", new UniConfig());
}
/** 腾讯短信差异化配置*/
@Bean
public TencentConfig tencentConfig(){
return injectObj("sms.tencent", new TencentConfig());
}
/** 京东云短信差异化配置 */
@Bean
public JdCloudConfig jdCloudConfig(){
return injectObj("sms.jdcloud", new JdCloudConfig());
}
/** 容联云短信差异化配置 */
@Bean
public CloopenConfig cloopenConfig(){
return injectObj("sms.cloopen", new CloopenConfig());
}
/**
* 亿美软通短信差异化配置
*/
@Bean
public EmayConfig emayConfig(){
return injectObj("sms.emay", new EmayConfig());
}
/** 天翼云短信差异化配置 */
@Bean
public CtyunConfig ctyunConfig(){
return injectObj("sms.ctyun", new CtyunConfig());
} }
} }

View File

@ -1,78 +0,0 @@
package org.dromara.sms4j.solon.utils;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.dao.SmsDao;
import org.noear.solon.Solon;
import org.redisson.api.RedissonClient;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Slf4j
public class SmsRedisDaoImpl implements SmsDao {
private RedissonClient redisTemplate;
public SmsRedisDaoImpl() {
Thread t = new Thread(()->{
//如果获取到的bean为null则等待后重试最多重试五次
for(int i = 0; i < 5 ;i++){
RedissonClient bean = Solon.context().getBean(RedissonClient.class);
if (Objects.isNull(bean)){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else{
redisTemplate = bean;
return;
}
}
});
t.start();
}
public SmsRedisDaoImpl(RedissonClient redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public void set(String key, Object value, long cacheTime) {
redisTemplate.getBucket(key).set(value, cacheTime, TimeUnit.SECONDS);
}
@Override
public void set(String key, Object value) {
redisTemplate.getBucket(key).set(value);
}
@Override
public Object get(String key) {
return redisTemplate.getBucket(key).get();
}
/**
* <p>说明将Map中的数据批量放置到redis中
* <p>
*
* @param valueMap 要放入的数据
* @name: multiSet
* @author :Wind
*/
public boolean multiSet(Map valueMap) {
try {
valueMap.forEach((key, val) -> redisTemplate.getBucket((String) key).set(val));
return true;
} catch (Exception e) {
log.error(e.toString());
return false;
}
}
@Override
public void clean() throws RuntimeException {
//TODO
}
}

View File

@ -1,14 +0,0 @@
package org.dromara.sms4j.demo;
import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain;
/**
* @author noear 2023/5/16 created
*/
@SolonMain
public class App {
public static void main(String[] args){
Solon.start(App.class, args);
}
}

View File

@ -1,87 +0,0 @@
package org.dromara.sms4j.demo;
import org.noear.solon.Utils;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.SingleServerConfig;
import java.util.Properties;
/**
* @author noear 2023/5/16 created
*/
@Configuration
public class Config {
@Bean
public RedissonClient redisInit(@Inject("${sms4j.redis}") Properties props) {
return build(props);
}
public RedissonClient build(Properties prop) {
String server_str = prop.getProperty("server");
String db_str = prop.getProperty("db");
String user_str = prop.getProperty("user");
String password_str = prop.getProperty("password");
int db = 0;
if (Utils.isNotEmpty(db_str)) {
db = Integer.parseInt(db_str);
}
//
// 开始实例化 redissonClient
//
org.redisson.config.Config config = new org.redisson.config.Config();
if (server_str.contains(",")) {
//集群
ClusterServersConfig serverConfig = config.useClusterServers();
//注入一般配置
Utils.injectProperties(serverConfig, prop);
//设置关键配置
String[] address = resolveServers(server_str.split(","));
serverConfig.addNodeAddress(address)
.setUsername(user_str)
.setPassword(password_str);
} else {
//单例
SingleServerConfig serverConfig = config.useSingleServer();
//注入一般配置
Utils.injectProperties(serverConfig, prop);
//设置关键配置
String[] address = resolveServers(server_str);
serverConfig.setAddress(address[0])
.setUsername(user_str)
.setPassword(password_str)
.setDatabase(db);
}
return Redisson.create(config);
}
private String[] resolveServers(String... servers) {
String[] uris = new String[servers.length];
for (int i = 0; i < servers.length; i++) {
String sev = servers[i];
if (sev.contains("://")) {
uris[i] = sev;
} else {
uris[i] = "redis://" + sev;
}
}
return uris;
}
}

View File

@ -1,25 +0,0 @@
package org.dromara.sms4j.test;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.noear.solon.test.SolonJUnit4ClassRunner;
import org.noear.solon.test.SolonTest;
@RunWith(SolonJUnit4ClassRunner.class)
@SolonTest
public class Sms4jTest {
@Test
public void uniSmsTest() {
// UniConfig build = UniConfig.builder()
// .signature("***")
// .accessKeyId("7Cr1***VJQ11Ap4***Mo7xmFg")
// .templateId("2001")
// .templateName("message")
// .isSimple(true)
// .build();
// SupplierFactory.setUniConfig(build);
// SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.UNI_SMS).sendMessage("175***65952", "123123");
// System.out.println(smsResponse);
}
}

View File

@ -16,10 +16,6 @@
<description>sms4j-spring-boot-starter</description> <description>sms4j-spring-boot-starter</description>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.dromara.sms4j</groupId> <groupId>org.dromara.sms4j</groupId>

View File

@ -12,11 +12,9 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.data.repository.query.Param;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;