背景需求
最近有这么一个需求:由于本地系统信息与另一个系统数据可能不一致,两个系统有各自的独立数据库和业务,在通信过程中网络等原因,导致两者之间的关键信息有差异,因此本地数据库中可能有10W条记录需要更新,本地数据库的信息需要逐条与远程http请求数据,对比或更新。
技术分析
如果将本地数据库全部取出放入一个集合中,然后遍历并发送http请求核对数据,显然不太现实。存储10W条记录需要多大的缓存?而且这样做对系统资源占用也很高。
采用生产消费者模式批量处理数据。生产消费者模式维护一个队列,一个线程添加数据,另一个线程取数据,可通过控制线程的数量来控制处理的速度。
思路:用分页取批量数据,放入一个阻塞式队列LinkedBlockingQueue
中,开启另一个线程从队列中取数据,循环以上过程,直到全部数据处理完毕(数据处理到最后一页),队列为空。
代码实现
- Talk is cheap, show me code
public class CheckRecordWithChannel {
private static final Logger logger = LoggerFactory.getLogger(CheckRecordWithChannel.class);
//500条数据
private volatile BlockingQueue<WechatTransInfo> orderQueue = new LinkedBlockingQueue<>(500);
public static final int PAGE_NUM = 200;
//生产完成标志
private boolean produceFlag = false;
//消费完成标志
private boolean cosumerFlag = false;
//当前页面数
private int currentPageNum = 0;
private CheckOrderBusinessHandle businessHandle;
/**
* 构造方法
* @param businessHandle 需要实现的特殊业务方法
*/