package com.zy.core.cache; import com.zy.core.enums.SlaveType; import com.zy.core.model.Task; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingQueue; /** * 消息队列 * Created by vincent on 2020/8/5 */ public class MessageQueue { // 堆垛机mq交换机 private static final Map> CRN_EXCHANGE = new ConcurrentHashMap<>(); // 双工位堆垛机mq交换机 private static final Map> DUAL_CRN_EXCHANGE = new ConcurrentHashMap<>(); // 输送线mq交换机 private static final Map> DEVP_EXCHANGE = new ConcurrentHashMap<>(); // 条码扫描仪mq交换机 private static final Map> BARCODE_EXCHANGE = new ConcurrentHashMap<>(); // Led灯 mq交换机 private static final Map> LED_EXCHANGE = new ConcurrentHashMap<>(); // 磅称mq交换机 private static final Map> SCALE_EXCHANGE = new ConcurrentHashMap<>(); // RGVmq交换机 private static final Map> RGV_EXCHANGE = new ConcurrentHashMap<>(); /** * mq 交换机初始化 */ public static void init(SlaveType type, Integer id) { switch (type) { case Crn: CRN_EXCHANGE.put(id, new LinkedBlockingQueue<>(1)); break; case DualCrn: DUAL_CRN_EXCHANGE.put(id, new LinkedBlockingQueue<>(1)); break; case Rgv: RGV_EXCHANGE.put(id, new LinkedBlockingQueue<>(1)); break; case Devp: DEVP_EXCHANGE.put(id, new ConcurrentLinkedQueue<>()); break; case Barcode: BARCODE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>()); break; case Led: LED_EXCHANGE.put(id, new LinkedBlockingQueue<>(1)); break; case Scale: SCALE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>()); break; default: break; } } /** * 添加元素 * 如果发现队列已满无法添加的话,会直接返回false。 */ public static boolean offer(SlaveType type, Integer id, Task task) { Queue queue = resolveQueue(type, id); if (queue == null) { return false; } switch (type) { case Crn: case DualCrn: case Rgv: case Devp: case Barcode: case Led: case Scale: return queue.offer(task); default: return false; } } /** * 移除元素 * 若队列为空,返回null。 */ public static Task poll(SlaveType type, Integer id) { Queue queue = resolveQueue(type, id); if (queue == null) { return null; } switch (type) { case Crn: case DualCrn: case Rgv: case Devp: case Barcode: case Led: case Scale: return queue.poll(); default: return null; } } /** * 取出元素,并不删除. */ public static Task peek(SlaveType type, Integer id) { Queue queue = resolveQueue(type, id); if (queue == null) { return null; } switch (type) { case Crn: case DualCrn: case Rgv: case Devp: case Barcode: case Led: case Scale: return queue.peek(); default: return null; } } public static void clear(SlaveType type, Integer id){ Queue queue = resolveQueue(type, id); if (queue == null) { return; } switch (type) { case Crn: case DualCrn: case Rgv: case Devp: case Barcode: case Led: case Scale: queue.clear(); break; default: break; } } public static boolean hasExchange(SlaveType type, Integer id) { return resolveQueue(type, id) != null; } public static int size(SlaveType type, Integer id) { Queue queue = resolveQueue(type, id); return queue == null ? 0 : queue.size(); } private static Queue resolveQueue(SlaveType type, Integer id) { if (type == null || id == null) { return null; } switch (type) { case Crn: return CRN_EXCHANGE.get(id); case DualCrn: return DUAL_CRN_EXCHANGE.get(id); case Rgv: return RGV_EXCHANGE.get(id); case Devp: return DEVP_EXCHANGE.get(id); case Barcode: return BARCODE_EXCHANGE.get(id); case Led: return LED_EXCHANGE.get(id); case Scale: return SCALE_EXCHANGE.get(id); default: return null; } } }