package com; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; /** * MQ * @author pengbo * */ public class QueueManager { public static final int MAX_QUEUE_SIZE = 200; //创建一个Map缓存 用来存储 BlockingQueued队列 public static Map<QueueType, ArrayBlockingQueue<Object>> queueMap = new ConcurrentHashMap<QueueManager.QueueType, ArrayBlockingQueue<Object>>(); //创建一个endMap缓存 用来存储 读取文件的最后一段信息 用来标记 当前文档结束 public static Map<QueueType, ArrayBlockingQueue<Object>> queueEndMap = new ConcurrentHashMap<QueueManager.QueueType, ArrayBlockingQueue<Object>>(); //创建一个 状态缓存 value 存储的是 读取文件的数量 public static Map<QueueType, Integer> m = new HashMap<QueueType, Integer>(); public static enum QueueType { INFO, //txt堆栈的Key INFOEND, //txt文件 结束堆栈的Key SET, //加入堆栈的状态的Key GET //从堆栈取出信息的状态的Key } /** * 初始化堆栈 将空的Q 和空的状态设置到缓存中 */ public static void init() { ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<Object>(MAX_QUEUE_SIZE); ArrayBlockingQueue<Object> queueEnd = new ArrayBlockingQueue<Object>(MAX_QUEUE_SIZE); queueMap.put(QueueType.INFO,queue); queueEndMap.put(QueueType.INFOEND,queueEnd); m.put(QueueType.SET,0); m.put(QueueType.GET,0); } /** * 将信息推送到MQ中 存在缓存中 * @param type Map的Key * @param obj 需要推进去的信息 * @throws InterruptedException */ public static void startPut(QueueType type, Object obj) throws InterruptedException { ArrayBlockingQueue<Object> queue = queueMap.get(type); if (queue != null) queue.put(obj); } /** * 将获取文件最末位的信息推送到 endMQ中 存在缓存中 * @param type Map的Key * @param obj 需要推进去的信息 * @throws InterruptedException */ public static void endPut(QueueType type, Object obj) throws InterruptedException { ArrayBlockingQueue<Object> queue = queueEndMap.get(type); if (queue != null) queue.put(obj); } /** * 从缓存中 取走 Q中首个信息 如果队列是空的 返回 null * @param type * @return */ public static Object startPoll(QueueType type) { ArrayBlockingQueue<Object> queue = queueMap.get(type); Object o = null; if (queue != null) { o = queue.poll(); } return o; } /** * 从缓存中 取走 endQ中首个信息 如果队列是空的 返回 null * @param type * @return */ public static Object endPoll(QueueType type) { ArrayBlockingQueue<Object> queue = queueEndMap.get(type); Object o = null; if (queue != null) { o = queue.poll(); } return o; } /** * 在缓存中 查看Q中首个信息 如果队列是空的 返回 null * @param type * @return */ public static Object startPeek(QueueType type) { ArrayBlockingQueue<Object> queue = queueMap.get(type); Object o = null; if (queue != null) { o = queue.peek(); } return o; } /** * 从缓存中 查看 endQ中首个信息 如果队列是空的 返回 null * @param type * @return */ public static Object endPeek(QueueType type) { ArrayBlockingQueue<Object> queue = queueEndMap.get(type); Object o = null; if (queue != null) { o = queue.peek(); } return o; } /** * 结束标识 true:结束 false 未结束 * @param i 需要操作的文件总数 * @return */ public static boolean over(int i){ boolean tf =false; if (QueueManager.m.get(QueueType.SET) == i && QueueManager.m.get(QueueType.GET) == i && QueueManager.startPeek(QueueType.INFO) == null && QueueManager.endPeek(QueueType.INFOEND) == null) { tf = true; } return tf; } }
创建异步MQ操作
原创jueshizhanhun 博主文章分类:编程思想 ©著作权
文章标签 ArrayBlockingQueue ConcurrentHashMap 文章分类 Java 后端开发
-
教你如何判断Java代码中异步操作是否完成
本篇文章将介绍几种常见的方法来判断Java代码中异步操作是否完成。
java 异步任务 异步操作 -
异步通知功能的MQ
作者:ScienJus
异步 消息队列 数据库 使用场景 -
java创建MQ通道 mq java
ActiveMQ 和java应用的结合 章节导读 在java应用中嵌入ActiveMQ ActiveMq结合Spring 用Spring编写JMS客户端 &n
java创建MQ通道 java 网络 spring apache