diff --git a/pom.xml b/pom.xml index abf57bdf..c870b0c8 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ UTF-8 UTF-8 - 2.7.12 + 2.7.15 2.5.4 3.17.0 1.3.3 @@ -118,14 +118,6 @@ ${revision} - - - org.springframework.boot - spring-boot-starter-data-redis - ${spring.boot.version} - provided - - com.jdcloud.sdk diff --git a/sms4j-solon-plugin/pom.xml b/sms4j-solon-plugin/pom.xml index 75dc6f32..8bace810 100644 --- a/sms4j-solon-plugin/pom.xml +++ b/sms4j-solon-plugin/pom.xml @@ -26,18 +26,5 @@ org.dromara.sms4j sms4j-core - - - org.redisson - redisson - ${redisson.version} - - - - org.noear - solon-test - ${solon.version} - test - diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java new file mode 100644 index 00000000..5fc13b7d --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java @@ -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> factoryList; + + private final SmsConfig smsConfig; + private final Map> blends; + private final AppContext context; + + public SmsBlendsInitializer(List> factoryList, + SmsConfig smsConfig, + Map> 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 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 providerFactory = (BaseProviderFactory) 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()); + } + } + +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java index 33d6e24c..9dc33295 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java @@ -1,11 +1,15 @@ package org.dromara.sms4j.solon.config; import org.dromara.sms4j.aliyun.config.AlibabaConfig; +import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.cloopen.config.CloopenConfig; import org.dromara.sms4j.ctyun.config.CtyunConfig; 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.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.unisms.config.UniConfig; 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.core.AppContext; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + /** * smsConfig参数意义为确保注入时smsConfig已经存在 */ @@ -29,61 +37,16 @@ public class SupplierConfig { context.cfg().getProp(prefix).bindTo(obj); return obj; } - - - /** 阿里差异化配置*/ @Bean - public AlibabaConfig alibabaConfig(){ - return injectObj("sms.alibaba", new AlibabaConfig()); + protected Map> blends(){ + return injectObj("sms.blends",new LinkedHashMap<>()); } - /** 华为差异化配置*/ - @Bean - public HuaweiConfig huaweiConfig(){ - return injectObj("sms.huawei", new HuaweiConfig()); - } - /** 云片短信差异化配置*/ @Bean - public YunpianConfig yunpianConfig(){ - return injectObj("sms.yunpian", new YunpianConfig()); - } - - /** 合一短信差异化配置*/ - @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()); + protected SmsBlendsInitializer smsBlendsInitializer(List> factoryList, + SmsConfig smsConfig, + Map> blends){ + return new SmsBlendsInitializer(factoryList,smsConfig,blends,context); } } diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/utils/SmsRedisDaoImpl.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/utils/SmsRedisDaoImpl.java deleted file mode 100644 index fbb5a3d8..00000000 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/utils/SmsRedisDaoImpl.java +++ /dev/null @@ -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(); - } - - /** - *

说明:将Map中的数据批量放置到redis中 - *

- * - * @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 - } -} diff --git a/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/demo/App.java b/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/demo/App.java deleted file mode 100644 index 3c5948bb..00000000 --- a/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/demo/App.java +++ /dev/null @@ -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); - } -} diff --git a/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/demo/Config.java b/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/demo/Config.java deleted file mode 100644 index 43e97bb4..00000000 --- a/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/demo/Config.java +++ /dev/null @@ -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; - } -} diff --git a/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/test/Sms4jTest.java b/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/test/Sms4jTest.java deleted file mode 100644 index 9b6e2182..00000000 --- a/sms4j-solon-plugin/src/test/java/org/dromara/sms4j/test/Sms4jTest.java +++ /dev/null @@ -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); - } -} diff --git a/sms4j-solon-plugin/src/test/resources/app.yml b/sms4j-solon-plugin/src/test/resources/app.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/sms4j-spring-boot-starter/pom.xml b/sms4j-spring-boot-starter/pom.xml index 95148891..301339a8 100644 --- a/sms4j-spring-boot-starter/pom.xml +++ b/sms4j-spring-boot-starter/pom.xml @@ -16,10 +16,6 @@ sms4j-spring-boot-starter - - org.springframework.boot - spring-boot-starter-data-redis - org.dromara.sms4j diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsMainConfig.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsMainConfig.java index 8ce1f844..fb18ebf1 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsMainConfig.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsMainConfig.java @@ -12,11 +12,9 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Lazy; -import org.springframework.context.annotation.Primary; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.core.env.Environment; -import org.springframework.data.repository.query.Param; import java.util.concurrent.Executor;