Skip to content

Commit e3a9860

Browse files
committed
refactor:将微信公众号存储自动配置拆分为独立的存储类型配置类,并新增Redisson支持
1 parent 37c2db9 commit e3a9860

File tree

16 files changed

+557
-293
lines changed

16 files changed

+557
-293
lines changed

solon-plugins/wx-java-mp-solon-plugin/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@
2222
<dependency>
2323
<groupId>redis.clients</groupId>
2424
<artifactId>jedis</artifactId>
25-
<scope>compile</scope>
25+
<scope>provided</scope>
26+
</dependency>
27+
<dependency>
28+
<groupId>org.redisson</groupId>
29+
<artifactId>redisson</artifactId>
30+
<scope>provided</scope>
2631
</dependency>
2732
<dependency>
2833
<groupId>org.jodd</groupId>

solon-plugins/wx-java-mp-solon-plugin/src/main/java/com/binarywang/solon/wxjava/mp/config/WxMpStorageAutoConfiguration.java

Lines changed: 0 additions & 128 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.binarywang.solon.wxjava.mp.config.storage;
2+
3+
import com.binarywang.solon.wxjava.mp.properties.WxMpProperties;
4+
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
5+
6+
/**
7+
* @author <a href="https://github.com/buaazyl">zhangyl</a>
8+
*/
9+
public abstract class AbstractWxMpConfigStorageConfiguration {
10+
11+
protected WxMpDefaultConfigImpl config(WxMpDefaultConfigImpl config, WxMpProperties properties) {
12+
config.setAppId(properties.getAppId());
13+
config.setSecret(properties.getSecret());
14+
config.setToken(properties.getToken());
15+
config.setAesKey(properties.getAesKey());
16+
config.setUseStableAccessToken(properties.isUseStableAccessToken());
17+
18+
WxMpProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
19+
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
20+
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
21+
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
22+
if (configStorageProperties.getHttpProxyPort() != null) {
23+
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
24+
}
25+
26+
int maxRetryTimes = configStorageProperties.getMaxRetryTimes();
27+
if (configStorageProperties.getMaxRetryTimes() < 0) {
28+
maxRetryTimes = 0;
29+
}
30+
int retrySleepMillis = configStorageProperties.getRetrySleepMillis();
31+
if (retrySleepMillis < 0) {
32+
retrySleepMillis = 1000;
33+
}
34+
config.setRetrySleepMillis(retrySleepMillis);
35+
config.setMaxRetryTimes(maxRetryTimes);
36+
return config;
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.binarywang.solon.wxjava.mp.config.storage;
2+
3+
import com.binarywang.solon.wxjava.mp.properties.RedisProperties;
4+
import com.binarywang.solon.wxjava.mp.properties.WxMpProperties;
5+
import lombok.RequiredArgsConstructor;
6+
import me.chanjar.weixin.common.redis.JedisWxRedisOps;
7+
import me.chanjar.weixin.common.redis.WxRedisOps;
8+
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
9+
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
10+
import org.apache.commons.lang3.StringUtils;
11+
import org.noear.solon.annotation.Bean;
12+
import org.noear.solon.annotation.Condition;
13+
import org.noear.solon.annotation.Configuration;
14+
import org.noear.solon.core.AppContext;
15+
import redis.clients.jedis.Jedis;
16+
import redis.clients.jedis.JedisPool;
17+
import redis.clients.jedis.JedisPoolConfig;
18+
19+
/**
20+
* @author <a href="https://github.com/buaazyl">zhangyl</a>
21+
*/
22+
@Configuration
23+
@Condition(
24+
onProperty = "${" + WxMpProperties.PREFIX + ".config-storage.type} = jedis",
25+
onClass = Jedis.class
26+
)
27+
@RequiredArgsConstructor
28+
public class WxMpInJedisConfigStorageConfiguration extends AbstractWxMpConfigStorageConfiguration {
29+
private final WxMpProperties properties;
30+
private final AppContext applicationContext;
31+
32+
@Bean
33+
@Condition(onMissingBean = WxMpConfigStorage.class)
34+
public WxMpConfigStorage wxMpConfigStorage() {
35+
WxMpRedisConfigImpl config = getWxMpRedisConfigImpl();
36+
return this.config(config, properties);
37+
}
38+
39+
private WxMpRedisConfigImpl getWxMpRedisConfigImpl() {
40+
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
41+
JedisPool jedisPool;
42+
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
43+
jedisPool = getJedisPool();
44+
} else {
45+
jedisPool = applicationContext.getBean(JedisPool.class);
46+
}
47+
WxRedisOps redisOps = new JedisWxRedisOps(jedisPool);
48+
return new WxMpRedisConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
49+
}
50+
51+
private JedisPool getJedisPool() {
52+
WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
53+
RedisProperties redis = storage.getRedis();
54+
55+
JedisPoolConfig config = new JedisPoolConfig();
56+
if (redis.getMaxActive() != null) {
57+
config.setMaxTotal(redis.getMaxActive());
58+
}
59+
if (redis.getMaxIdle() != null) {
60+
config.setMaxIdle(redis.getMaxIdle());
61+
}
62+
if (redis.getMaxWaitMillis() != null) {
63+
config.setMaxWaitMillis(redis.getMaxWaitMillis());
64+
}
65+
if (redis.getMinIdle() != null) {
66+
config.setMinIdle(redis.getMinIdle());
67+
}
68+
config.setTestOnBorrow(true);
69+
config.setTestWhileIdle(true);
70+
71+
return new JedisPool(config, redis.getHost(), redis.getPort(), redis.getTimeout(), redis.getPassword(),
72+
redis.getDatabase());
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.binarywang.solon.wxjava.mp.config.storage;
2+
3+
import com.binarywang.solon.wxjava.mp.properties.WxMpProperties;
4+
import lombok.RequiredArgsConstructor;
5+
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
6+
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
7+
import org.noear.solon.annotation.Bean;
8+
import org.noear.solon.annotation.Condition;
9+
import org.noear.solon.annotation.Configuration;
10+
11+
/**
12+
* @author <a href="https://github.com/buaazyl">zhangyl</a>
13+
*/
14+
@Configuration
15+
@Condition(
16+
onProperty = "${wx.mp.config-storage.type:memory} = memory"
17+
)
18+
@RequiredArgsConstructor
19+
public class WxMpInMemoryConfigStorageConfiguration extends AbstractWxMpConfigStorageConfiguration {
20+
private final WxMpProperties properties;
21+
22+
@Bean
23+
@Condition(onMissingBean = WxMpConfigStorage.class)
24+
public WxMpConfigStorage wxMpConfigStorage() {
25+
WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
26+
config(config, properties);
27+
return config;
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.binarywang.solon.wxjava.mp.config.storage;
2+
3+
import com.binarywang.solon.wxjava.mp.properties.RedisProperties;
4+
import com.binarywang.solon.wxjava.mp.properties.WxMpProperties;
5+
import lombok.RequiredArgsConstructor;
6+
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
7+
import me.chanjar.weixin.mp.config.impl.WxMpRedissonConfigImpl;
8+
import org.apache.commons.lang3.StringUtils;
9+
import org.noear.solon.annotation.Bean;
10+
import org.noear.solon.annotation.Condition;
11+
import org.noear.solon.annotation.Configuration;
12+
import org.noear.solon.core.AppContext;
13+
import org.redisson.Redisson;
14+
import org.redisson.api.RedissonClient;
15+
import org.redisson.config.Config;
16+
import org.redisson.config.TransportMode;
17+
18+
/**
19+
* @author <a href="https://github.com/buaazyl">zhangyl</a>
20+
*/
21+
@Configuration
22+
@Condition(
23+
onProperty = "${" + WxMpProperties.PREFIX + ".config-storage.type} = redisson",
24+
onClass = Redisson.class
25+
)
26+
@RequiredArgsConstructor
27+
public class WxMpInRedissonConfigStorageConfiguration extends AbstractWxMpConfigStorageConfiguration {
28+
private final WxMpProperties properties;
29+
private final AppContext applicationContext;
30+
31+
@Bean
32+
@Condition(onMissingBean = WxMpConfigStorage.class)
33+
public WxMpConfigStorage wxMaConfig() {
34+
WxMpRedissonConfigImpl config = getWxMpInRedissonConfigStorage();
35+
return this.config(config, properties);
36+
}
37+
38+
private WxMpRedissonConfigImpl getWxMpInRedissonConfigStorage() {
39+
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
40+
RedissonClient redissonClient;
41+
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
42+
redissonClient = getRedissonClient();
43+
} else {
44+
redissonClient = applicationContext.getBean(RedissonClient.class);
45+
}
46+
return new WxMpRedissonConfigImpl(redissonClient, properties.getConfigStorage().getKeyPrefix());
47+
}
48+
49+
private RedissonClient getRedissonClient() {
50+
WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
51+
RedisProperties redis = storage.getRedis();
52+
53+
Config config = new Config();
54+
config.useSingleServer()
55+
.setAddress("redis://" + redis.getHost() + ":" + redis.getPort())
56+
.setDatabase(redis.getDatabase())
57+
.setPassword(redis.getPassword());
58+
config.setTransportMode(TransportMode.NIO);
59+
return Redisson.create(config);
60+
}
61+
}

solon-plugins/wx-java-mp-solon-plugin/src/main/java/com/binarywang/solon/wxjava/mp/integration/WxMpPluginImpl.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.binarywang.solon.wxjava.mp.integration;
22

33
import com.binarywang.solon.wxjava.mp.config.WxMpServiceAutoConfiguration;
4-
import com.binarywang.solon.wxjava.mp.config.WxMpStorageAutoConfiguration;
4+
import com.binarywang.solon.wxjava.mp.config.storage.WxMpInJedisConfigStorageConfiguration;
5+
import com.binarywang.solon.wxjava.mp.config.storage.WxMpInMemoryConfigStorageConfiguration;
6+
import com.binarywang.solon.wxjava.mp.config.storage.WxMpInRedissonConfigStorageConfiguration;
57
import com.binarywang.solon.wxjava.mp.properties.WxMpProperties;
68
import org.noear.solon.core.AppContext;
79
import org.noear.solon.core.Plugin;
@@ -13,8 +15,10 @@ public class WxMpPluginImpl implements Plugin {
1315
@Override
1416
public void start(AppContext context) throws Throwable {
1517
context.beanMake(WxMpProperties.class);
16-
17-
context.beanMake(WxMpStorageAutoConfiguration.class);
1818
context.beanMake(WxMpServiceAutoConfiguration.class);
19+
20+
context.beanMake(WxMpInMemoryConfigStorageConfiguration.class);
21+
context.beanMake(WxMpInJedisConfigStorageConfiguration.class);
22+
context.beanMake(WxMpInRedissonConfigStorageConfiguration.class);
1923
}
2024
}

solon-plugins/wx-java-mp-solon-plugin/src/main/java/com/binarywang/solon/wxjava/mp/properties/WxMpProperties.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,24 @@ public static class ConfigStorage implements Serializable {
101101
*/
102102
private String httpProxyPassword;
103103

104+
/**
105+
* http 请求最大重试次数
106+
* <pre>
107+
* {@link me.chanjar.weixin.mp.api.WxMpService#setMaxRetryTimes(int)}
108+
* {@link me.chanjar.weixin.mp.api.impl.BaseWxMpServiceImpl#setMaxRetryTimes(int)}
109+
* </pre>
110+
*/
111+
private int maxRetryTimes = 5;
112+
113+
/**
114+
* http 请求重试间隔
115+
* <pre>
116+
* {@link me.chanjar.weixin.mp.api.WxMpService#setRetrySleepMillis(int)}
117+
* {@link me.chanjar.weixin.mp.api.impl.BaseWxMpServiceImpl#setRetrySleepMillis(int)}
118+
* </pre>
119+
*/
120+
private int retrySleepMillis = 1000;
121+
104122
}
105123

106124
}

0 commit comments

Comments
 (0)