jfinal weixin中的ApiConfig及AccessToken设计

苏珊大妈 发布于 2016/07/27 22:03
阅读 903
收藏 0

@JFinal 你好,想跟你请教个问题:

jfinal weixin中的ApiConfig及AccessToken设计,我看源码,现在的设计是AccessToken默认放在本地内存中的,而ApiConfig今天我更新了一下源码,发现1.9版本的在设计又不一样了,原来是

ThreadLocal<ApiConfig> tl = new ThreadLocal<ApiConfig>(),



而现在1.9版本的是分开对待
private static final ThreadLocal<String> TL = new ThreadLocal<String>();
private static final Map<String, ApiConfig> CFG_MAP = new ConcurrentHashMap<String, ApiConfig>();




相同之处是在一个控制请求开始时将 appId 与当前线程绑定,结束时删除,不同之处是现在把具体的ApiConfig单独提了出来,同时我在源码中也没有查到何时有调用removeApiConfig操作。难道就这样一直存放着吗?

针对存放AccessToken及ApiConfig的设计让我特别疑惑,有如下几个问题请教:
1、AccessToken及ApiConfig为什么要分开设计成两个对象,设计成一个对象从IO中根据appid查询出来然后序列化放在缓存中这样不好吗?

2、AccessToken及ApiConfig现在1.9版本感觉是分开存在三个地方,appid与本地线程绑定、ApiConfig是用一个本地线程安全的Map来模拟的存储的、AccessToken更复杂,默认同ApiConfig一样放在本地线程安全的Map来模拟的存储,同时还具有扩展性可放在redis中,就是这几个让我特别疑惑,因为喜欢看源码,对看不透理解不了你们的设计想法的时候,就越想来了解想弄明白,所以才来不耻下问,我的第一想法是这两个对象为啥不放在session中,或合并后放在本地线程的Map中,或redis中,而要分开设计?

3、针对多公众号支持的设计,我看现在1.9版本也有所改动, 是统一放在WeixinConfig的afterJFinalStart进行初使化,但这时我如何动态根据URL来获取appid,即像以前的String appid = getPara("appid", "默认的appid");这样动态获取呢?


我的想法是一般在项目应用中Access相关信息都是放在数据库中的,然后根据URL上的appid去动态查询出对应的公众号Access,然后再把这个对象序列化后放在缓存中,可能我考虑得太简单了,但看了jfinal weixin的源码(对jfinal不是很熟悉,直接看的weixin部份源码)后,根据微信的流程边看源码,感觉这儿有点不理解。指大神指教,谢谢。

加载中
0
JFinal
JFinal
1.9 尚在开发中,并未正式发布,现在的设计是否要采纳还是个未知数,建议先用 1.8  @如梦技术
如梦技术
如梦技术
上次准备改下的,代码都写一大半了,然后给回退了。现在不太方便用户使用,很多尝试1.9的朋友都蒙逼了,改肯定是会改的。
苏珊大妈
苏珊大妈
那能为我讲讲 1.8中AccessToken、ApiConfig二者为啥要这样存放吗。具体好处在哪。没绕过来这个弯~~~~~
0
DuLerWeil
DuLerWeil

目前的设计将原先controller.getApiConfig()里反复创建ApiConfig改成启动时全局一次性加载每个公众号对应的ApiConfig并建立与AppId的映射。

后续只需从请求中取得某种公众号的标识,推导出AppId,根据映射取ApiConfig完成后续操作。

至于推导过程,定义了AppIdParser接口,并提供了一个默认的实现,可浏览相关代码。自己可根据需要实现这个接口,并参照下段代码配置

public void configInterceptor(Interceptors me) { // ApiInterceptor.setAppIdParser(new AppIdParser.DefaultParameterAppIdParser("appId")); 默认无需设置 // MsgInterceptor.setAppIdParser(new AppIdParser.DefaultParameterAppIdParser("appId")); 默认无需设置 }

另外关于ThreadLocal,也相应地从ApiConfig改成AppId。

JFinal
JFinal
回复 @苏珊大妈 : jfinal weixin 1.8 你也不用每次都 new ApiConfig,只需要 new 一次,然后每次都直接 return 以前 new 过的对象就可以。最简单的办法是弄个 static 指针来放这个 ApiConfig 对象
苏珊大妈
苏珊大妈
回复 @DuLerWeil : 对,从概念上讲确实是一个是永久的一个是需一定周期内需要刷新的,但accesstoken需要刷新的时候肯定需要先获取到ApiConfig对吧,所以说二者为啥不合并成一个对象来管理呢,可以理解为access_token为一个不需持久化的临时字段,这样只需管理一个缓存不更方便吗?可能我的理解进入了误区~!!!
DuLerWeil
DuLerWeil
回复 @DuLerWeil : 另外,不明白你所说的合并在一起缓存是怎样的形式。
DuLerWeil
DuLerWeil
回复 @苏珊大妈 : ApiConfig和AccessToken本身就是两个概念,并且前者可以认为是永久的,后者需要定期刷新。
苏珊大妈
苏珊大妈
这样确实是减少了每次new apiconfig,但把所有的apiconfig都放在了map中,这样好吗,并且我有点晕的地方是为啥apiconfig与accesstoken二者不合并成一个对方,然后统一缓存呢,这样更一目了然,还是二者分开管理,更OOP?
返回顶部
顶部