package com.zy.core.cache; 
 | 
  
 | 
import com.zy.asrs.utils.CommandUtils; 
 | 
import com.zy.core.Slave; 
 | 
import com.zy.core.enums.SlaveType; 
 | 
import com.zy.core.model.Task; 
 | 
  
 | 
import java.util.Map; 
 | 
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, 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<>(); 
 | 
    // 台车mq交换机 
 | 
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>(); 
 | 
  
 | 
    /** 
 | 
     * mq 交换机初始化 
 | 
     */ 
 | 
    public static void init(SlaveType type, Slave slave) { 
 | 
        switch (type) { 
 | 
            case Crn: 
 | 
                CRN_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1)); 
 | 
                break; 
 | 
            case Devp: 
 | 
                DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); 
 | 
                break; 
 | 
            case Barcode: 
 | 
                BARCODE_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); 
 | 
                break; 
 | 
            case Led: 
 | 
                LED_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1)); 
 | 
                break; 
 | 
            case Scale: 
 | 
                SCALE_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); 
 | 
                break; 
 | 
            case Car: 
 | 
                CAR_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); 
 | 
                break; 
 | 
            default: 
 | 
                break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 添加元素 
 | 
     * 如果发现队列已满无法添加的话,会直接返回false。 
 | 
     */ 
 | 
    public static boolean offer(SlaveType type, Integer id, Task task) { 
 | 
        switch (type) { 
 | 
            case Crn: 
 | 
                return CRN_EXCHANGE.get(id).offer(task); 
 | 
            case Devp: 
 | 
                return DEVP_EXCHANGE.get(id).offer(task); 
 | 
            case Barcode: 
 | 
                return BARCODE_EXCHANGE.get(id).offer(task); 
 | 
            case Led: 
 | 
                return LED_EXCHANGE.get(id).offer(task); 
 | 
            case Scale: 
 | 
                return SCALE_EXCHANGE.get(id).offer(task); 
 | 
            case Car: 
 | 
                return CAR_EXCHANGE.get(id).offer(task); 
 | 
            default: 
 | 
                return false; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 移除元素 
 | 
     * 若队列为空,返回null。 
 | 
     */ 
 | 
    public static Task poll(SlaveType type, Integer id) { 
 | 
        switch (type) { 
 | 
            case Crn: 
 | 
                return CRN_EXCHANGE.get(id).poll(); 
 | 
            case Devp: 
 | 
                return DEVP_EXCHANGE.get(id).poll(); 
 | 
            case Barcode: 
 | 
                return BARCODE_EXCHANGE.get(id).poll(); 
 | 
            case Led: 
 | 
                return LED_EXCHANGE.get(id).poll(); 
 | 
            case Scale: 
 | 
                return SCALE_EXCHANGE.get(id).poll(); 
 | 
            case Car: 
 | 
                return CAR_EXCHANGE.get(id).poll(); 
 | 
            default: 
 | 
                return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 取出元素,并不删除. 
 | 
     */ 
 | 
    public static Task peek(SlaveType type, Integer id) { 
 | 
        switch (type) { 
 | 
            case Crn: 
 | 
                return CRN_EXCHANGE.get(id).peek(); 
 | 
            case Devp: 
 | 
                return DEVP_EXCHANGE.get(id).peek(); 
 | 
            case Barcode: 
 | 
                return BARCODE_EXCHANGE.get(id).peek(); 
 | 
            case Led: 
 | 
                return LED_EXCHANGE.get(id).peek(); 
 | 
            case Scale: 
 | 
                return SCALE_EXCHANGE.get(id).peek(); 
 | 
            case Car: 
 | 
                return CAR_EXCHANGE.get(id).peek(); 
 | 
            default: 
 | 
                return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static void clear(SlaveType type, Integer id){ 
 | 
        switch (type) { 
 | 
            case Crn: 
 | 
                 
 | 
                CRN_EXCHANGE.get(id).clear(); 
 | 
                break; 
 | 
            case Devp: 
 | 
                DEVP_EXCHANGE.get(id).clear(); 
 | 
                break; 
 | 
            case Barcode: 
 | 
                BARCODE_EXCHANGE.get(id).clear(); 
 | 
                break; 
 | 
            case Led: 
 | 
                LED_EXCHANGE.get(id).clear(); 
 | 
                break; 
 | 
            case Scale: 
 | 
                SCALE_EXCHANGE.get(id).clear(); 
 | 
                break; 
 | 
            case Car: 
 | 
                CAR_EXCHANGE.get(id).clear(); 
 | 
                break; 
 | 
            default: 
 | 
                break; 
 | 
        } 
 | 
    } 
 | 
    public static boolean offer(SlaveType type, Integer devpId, Task task, Runnable callback) { 
 | 
        boolean result = offer(type, devpId, task); // 先执行原有任务逻辑 
 | 
        if (result && callback != null) { 
 | 
            new Thread(() -> { 
 | 
                try { 
 | 
                    Thread.sleep(200); // 模拟任务执行时间 
 | 
                    callback.run(); 
 | 
                } catch (InterruptedException e) { 
 | 
                    Thread.currentThread().interrupt(); 
 | 
                } 
 | 
            }).start(); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |