package com.zy.core.cache; import com.zy.core.model.protocol.TaskProtocol; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * Created by IX on 2025/02/21 */ @Slf4j public class TaskProtocolCache { // 本地缓存,键为 taskNo,值为 TaskProtocol private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); // 读写锁,确保线程安全 // private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); /** * 更新设备状态 */ public void updateTaskProtocol(TaskProtocol status) { cache.put(status.getTaskNoDirection(), status); } /** * 删除任务缓存 */ public TaskProtocol removeTaskProtocol(String taskNoDirection) { // lock.readLock().lock(); // 加读锁 try { return cache.remove(taskNoDirection); } finally { // lock.readLock().unlock(); // 释放读锁 } } /** * 获取所有任务 */ public ConcurrentHashMap getAllTaskProtocol() { // lock.readLock().lock(); // 加读锁 try { return new ConcurrentHashMap<>(cache); // 返回副本 } finally { // lock.readLock().unlock(); // 释放读锁 } } /** * 获取所有取任务 */ public List getTakeOrPutTaskProtocol(short loaded) { if (loaded == 0){ return getAllTakeTaskProtocol(); } else if (loaded == 1){ return getAllPutTaskProtocol(); } return new ArrayList<>(); } /** * 获取所有取任务 */ public List getAllTakeTaskProtocol() { // lock.readLock().lock(); // 加读锁 try { List allTakeTaskProtocol = new ArrayList<>(); for (TaskProtocol task : cache.values()) { if (task.getTaskStatus()==1) { allTakeTaskProtocol.add(task); } } return allTakeTaskProtocol; // 返回副本 } finally { // lock.readLock().unlock(); // 释放读锁 } } /** * 获取所有放任务 */ public List getAllPutTaskProtocol() { // lock.readLock().lock(); // 加读锁 try { List allPutTaskProtocol = new ArrayList<>(); for (TaskProtocol task : cache.values()) { if (task.getTaskStatus()==2) { allPutTaskProtocol.add(task); } } return allPutTaskProtocol; // 返回副本 } finally { // lock.readLock().unlock(); // 释放读锁 } } /** * 获取所有行走任务 */ public List getAllWalkTaskProtocol() { // lock.readLock().lock(); // 加读锁 try { List allWalkTaskProtocol = new ArrayList<>(); for (TaskProtocol task : cache.values()) { if (task.getTaskStatus()==0) { allWalkTaskProtocol.add(task); } } return allWalkTaskProtocol; // 返回副本 } finally { // lock.readLock().unlock(); // 释放读锁 } } }