Description
WxMpMapConfigImpl config = new WxMpMapConfigImpl();
config.setAppId(wxConfig.getMqAppId());
config.setSecret(wxConfig.getMqAppSecret());
config.useStableAccessToken(true);
globalWxMpService.addConfigStorage(config.getAppId(),config);
模块版本情况
- WxJava 模块名: wx-java-map
- WxJava 版本号: 4.6.0 (4.7.0 中的代码也是一样)
详细描述
背景:单机多租户模式,一个服务提供多个微信公众号相关的服务,根据租户标识区分。 上面的代码是在初始化的时候,确保 WxMpServiceImpl 中没有保存该租户WxMpMapConfig的时候,存入 WxMpConfigStorage。
问题:假设目前有2个租户,初始化了WxMpConfigStorage并存入。问题提在于 WxMpMapConfigImpl 中的 CONCURRENT_HASH_MAP 是静态属性,每次根据不同租户获取 WxMpConfigStorage 的时候确实能获取到不同的 WxMpMapConfigImpl 对象,但是获取到token的时候会出现静态属性覆盖的情况。 因为key是一样的,设置token以及获取token 都是固定的 "access_token",没有通过 CONCURRENT_HASH_MAP.get(this.getAppId()); 来做租户区分。
@DaTa
public class WxMpMapConfigImpl extends WxMpDefaultConfigImpl {
private static final ConcurrentHashMap<String, String> CONCURRENT_HASH_MAP = new ConcurrentHashMap<>(1);
private static final String MAP_KEY = "access_token";
@OverRide
public String getAccessToken() {
return CONCURRENT_HASH_MAP.get(MAP_KEY);
}
}
修改建议
- CONCURRENT_HASH_MAP 取消静态,改成非静态。
- CONCURRENT_HASH_MAP.get(this.getAppId()); 来做租户区分