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<Integer, LinkedBlockingQueue<Task>> CRN_EXCHANGE = new ConcurrentHashMap<>();
|
// 双工位堆垛机mq交换机
|
private static final Map<Integer, LinkedBlockingQueue<Task>> DUAL_CRN_EXCHANGE = new ConcurrentHashMap<>();
|
// 输送线mq交换机
|
private static final Map<Integer, ConcurrentLinkedQueue<Task>> DEVP_EXCHANGE = new ConcurrentHashMap<>();
|
// 条码扫描仪mq交换机
|
private static final Map<Integer, ConcurrentLinkedQueue<Task>> BARCODE_EXCHANGE = new ConcurrentHashMap<>();
|
// Led灯 mq交换机
|
private static final Map<Integer, LinkedBlockingQueue<Task>> LED_EXCHANGE = new ConcurrentHashMap<>();
|
// 磅称mq交换机
|
private static final Map<Integer, ConcurrentLinkedQueue<Task>> SCALE_EXCHANGE = new ConcurrentHashMap<>();
|
// RGVmq交换机
|
private static final Map<Integer, LinkedBlockingQueue<Task>> 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<Task> 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<Task> 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<Task> 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<Task> 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<Task> queue = resolveQueue(type, id);
|
return queue == null ? 0 : queue.size();
|
}
|
|
private static Queue<Task> 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;
|
}
|
}
|
|
}
|