赞
踩
这里我推荐大家使用BlockingQueue
,该队列为阻塞队列
将数据先写入队列中,然后开启多个消费线程慢慢消费入库。从队列中消费数据有两种方式:
单条消费
批量消费
@Component public class RequestQueue<T> { /** * 获取开门记录队列 */ BlockingQueue<JSONObject> blockingQueue = new ArrayBlockingQueue<>(1000000,true); /** * 获取请求队列数据 */ public BlockingQueue<JSONObject> getBlockingQueue(){ return blockingQueue; } /** * 保存数据进入队列 */ public void putJsonDataQueue(JSONObject jsonObject){ try { getBlockingQueue().put(jsonObject); }catch (Exception e){ e.printStackTrace(); } } }
@Component public class DoorOpeningRecordTask extends Thread{ @Autowired private RequestQueue requestQueue; @Autowired private DoorOpeningRecordService doorOpeningRecordService; @Override public void run(){ while(true){ try { //取出信息列表 List<JSONObject> list = new ArrayList<>(); //参数列表: 获取队列 数据 批量处理一百条 500毫秒 Queues.drain(requestQueue.getBlockingQueue(), list, 100, 500, TimeUnit.MILLISECONDS); //对数据进行保存 doorOpeningRecordService.save(list); }catch (Exception e){ e.printStackTrace(); } } } }
@Component public class QueueListener { @Autowired private DoorOpeningRecordTask doorOpeningRecordTask; /** * 初始化时启动监听请求队列 */ @PostConstruct public void init() { doorOpeningRecordTask.start(); } /** * 销毁容器时停止监听任务 */ @PreDestroy public void destory() { doorOpeningRecordTask.interrupt(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。