在微信开发文档中我们可以看到这样的描述:如果请求超过5秒没有响应,微信会自动断开连接,并重新发起请求,幂等的。最多请求三次。
那么会有什么问题呢?
1、如果我们5秒内没有处理完消息,断开连接就没法响应了
2、我们5秒内没有处理完,微信又重新发起了请求,导致我们处理重复
针对上面的问题,其实我们想要解决的问题也就两点,一是耗时处理结果如何响应,二是微信端重复请求如何过滤。
解决方案:
方案一:
微信端发来第一个请求时就直接将请求参数加入异步队列,然后直接返回success。
因为返回了响应,微信端会认为请求结束,而不会重试。
我们在异步队列中处理数据,处理之后通过微信的客服接口将结果推送给用户。
方案二:
接收到第一次请求后,将msgid唯一标识进行缓存,同时使用AsyncContext保持连接进行数据处理,将处理结果与msgid映射缓存。
因为是幂等请求,所以第二次请求时我们与缓存列表进行校对,如果已存在,则直接获取第一次请求的处理结果,获取到以后直接返回。
两种方案区别:
方案一,简单优雅,可在24小时内回复,但是需要使用微信高级接口,未认证订阅号无法使用。
方案二,通用方法,实现繁琐,需要考虑时间,要求数据处理时间不能超过15秒。
本文主要讲一个大概思路,博主使用的第二种通用方案,亲测可用(微信公众号: 小郝分享),如果有不明白的,可以留言反馈。