此项目基于 Spring Cloud + JPA 框架,对微信公众号进行二次开发。公众号所有的粉丝存储在 MySQL 的表中。会经常对公众号粉丝推送图文消息,在发送推文之前,会将此次要求触发的粉丝数据存储到另一张推文粉丝数据表中。专门有一个Java写的接口,传参是推文素材的 MediaID ,操作的数据来源是刚才提到的那张推文粉丝数据表,这张表中主要存储字段就是粉丝的 OpenID,status(推文发送状态,初始化是“未发送[0]”),message(微信公众号接口调用返回信息)。触发这个接口方法将会执行以下步骤:
- 在 redis 设置一个 “ImageTextMessageSending”的键作为锁,防止重复多次调用接口,重复发送推文;
- 通过 JPA 封装好的分页查询方法每次从推文粉丝数据表中拉取 500 条推文粉丝数据;
- 通过 JPA 的数据批量更新方法(其实是 save 方法,因为在 JPA 中如果传进来的 entity 自带 id,JPA 执行的就是更新操作,如果没有 id ,就执行数据新增操作),将当前操作的这 500 条推文发送状态更新为“发送中[1]”;
- 循环遍历这 500 条粉丝的 OpenID;
- 每次遍历封装一份调用微信公众号推送图文接口的请求参数体;
- 开启一个新的线程专门去调用微信公众号的接口方法;
- 当接口返回 success 后,将此条推文粉丝数据的发送状态更新为“已发送[2]”,返回 fail 时,发送状态更新为“已发送[2]”的同时,将返回的错误消息也一并存进 message 字段中(比如存在粉丝取关了,导致这条推文已经触达不到了);
- 重复循环 步骤2 - 步骤7 直至读取全部数据。结束循环,释放 redis 锁,发送推文任务结束。
以上介绍的是图文推送接口所做的任务步骤。
备注
优化过程及实践总结请移步此篇文章: juejin.cn/post/697059…