【java】调用微信模板消息推送,线程池优化推送速度。

来源:互联网 发布:云计算厂商 编辑:程序博客网 时间:2024/05/20 06:52

项目中用到微信小程序模板推送,原来流程如下:

1、获取当前公众号关注用户列表;

2、根据用户列表获取用户信息;

3、循环用户列表进行发送;

4、等待发送返回结果。将用户信息(昵称)、发送状态等保存到发送记录表;

存在问题:

1、每次推送都会到微信获取用户列表,并获取每个用户的昵称。接口调用频率高,发送时间较长。

推送:5000个用户,大约需要10分钟左右;



优化方案:(开启开发者功能)

1、用户关注公众号时,获取用户信息,存入用户信息表;用户取消关注也同步修改本地数据;

2、每晚定时同步公众号当前关注用户列表,防止遗漏;

3、推送模板时从本地获取公众号当前关注用户数据,直接推送这批用户。节省来回调用微信接口的时间成本;

当然,如果单纯这样优化,推送速度并没有明显提升;


再次优化:

1、推送模板消息使用线程池。我使用了java自带线程池newFixedThreadPool进行推送。设置每100毫秒推送10条,5000条数据也就1分钟推送完成。完美满足业务实时性需求。

2、线程池使用参考文档:http://cuisuqiang.iteye.com/blog/2019372

(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

Java代码  收藏代码
  1. package test;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4. public class ThreadPoolExecutorTest {  
  5.  public static void main(String[] args) {  
  6.   ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
  7.   for (int i = 0; i < 10; i++) {  
  8.    final int index = i;  
  9.    fixedThreadPool.execute(new Runnable() {  
  10.     public void run() {  
  11.      try {  
  12.       System.out.println(index);  
  13.       Thread.sleep(2000);  
  14.      } catch (InterruptedException e) {  
  15.       e.printStackTrace();  
  16.      }  
  17.     }  
  18.    });  
  19.   }  
  20.  }  
  21. }  

 
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()


原创粉丝点击