You've already forked FrameTour-BE
feat(printer): 实现打印机轮询选择功能
- 新增 getNextPrinter 方法实现打印机轮询逻辑 - 添加 Redis 键前缀 PRINTER_INDEX_KEY_PREFIX 和过期时间常量 - 在创建打印任务时设置选中的打印机名称- 支持多个打印机按顺序轮流使用 - 使用 Redis 原子递增确保并发安全的索引获取 - 自动为 Redis 键设置 5 分钟过期时间以避免内存泄漏
This commit is contained in:
@@ -444,6 +444,8 @@ public class PrinterServiceImpl implements PrinterService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RedisTemplate<String, String> redisTemplate;
|
private RedisTemplate<String, String> redisTemplate;
|
||||||
private static final String USER_PHOTO_LIST_TO_PRINTER = "USER_PHOTO_LIST_TO_PRINTER:";
|
private static final String USER_PHOTO_LIST_TO_PRINTER = "USER_PHOTO_LIST_TO_PRINTER:";
|
||||||
|
private static final String PRINTER_INDEX_KEY_PREFIX = "PRINTER_INDEX:";
|
||||||
|
private static final int PRINTER_INDEX_EXPIRE_MINUTES = 5;
|
||||||
private static final int TASK_STATUS_PENDING = 0;
|
private static final int TASK_STATUS_PENDING = 0;
|
||||||
private static final int TASK_STATUS_PROCESSING = 3;
|
private static final int TASK_STATUS_PROCESSING = 3;
|
||||||
private final Lock syncTaskLock = new ReentrantLock();
|
private final Lock syncTaskLock = new ReentrantLock();
|
||||||
@@ -559,8 +561,12 @@ public class PrinterServiceImpl implements PrinterService {
|
|||||||
log.error("获取景区配置失败,使用原始照片进行打印。景区ID: {}, 照片ID: {}", item.getScenicId(), item.getId(), e);
|
log.error("获取景区配置失败,使用原始照片进行打印。景区ID: {}, 照片ID: {}", item.getScenicId(), item.getId(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取打印机名称(支持轮询)
|
||||||
|
String selectedPrinter = getNextPrinter(printer);
|
||||||
|
|
||||||
PrintTaskEntity task = new PrintTaskEntity();
|
PrintTaskEntity task = new PrintTaskEntity();
|
||||||
task.setPrinterId(printer.getId());
|
task.setPrinterId(printer.getId());
|
||||||
|
task.setPrinterName(selectedPrinter);
|
||||||
task.setMpId(item.getId());
|
task.setMpId(item.getId());
|
||||||
task.setPaper(printer.getPreferPaper());
|
task.setPaper(printer.getPreferPaper());
|
||||||
task.setStatus(0);
|
task.setStatus(0);
|
||||||
@@ -572,4 +578,52 @@ public class PrinterServiceImpl implements PrinterService {
|
|||||||
printTaskMapper.insertTask(task);
|
printTaskMapper.insertTask(task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取下一个要使用的打印机名称(轮询逻辑)
|
||||||
|
*
|
||||||
|
* @param printer 打印机实体
|
||||||
|
* @return 选中的打印机名称
|
||||||
|
*/
|
||||||
|
private String getNextPrinter(PrinterEntity printer) {
|
||||||
|
String usePrinter = printer.getUsePrinter();
|
||||||
|
if (StringUtils.isBlank(usePrinter)) {
|
||||||
|
log.warn("打印机 {} 没有配置 usePrinter", printer.getId());
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分割打印机列表
|
||||||
|
String[] printers = usePrinter.split("\\|");
|
||||||
|
if (printers.length == 0) {
|
||||||
|
log.warn("打印机 {} 的 usePrinter 配置为空", printer.getId());
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果只有一个打印机,直接返回
|
||||||
|
if (printers.length == 1) {
|
||||||
|
return printers[0].trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从 Redis 原子递增获取索引
|
||||||
|
String redisKey = PRINTER_INDEX_KEY_PREFIX + printer.getId();
|
||||||
|
Long incrementedValue = redisTemplate.opsForValue().increment(redisKey);
|
||||||
|
|
||||||
|
if (incrementedValue == null) {
|
||||||
|
log.warn("Redis increment 操作失败,打印机ID: {}", printer.getId());
|
||||||
|
incrementedValue = 1L;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 每次递增后都重新设置过期时间为 5 分钟
|
||||||
|
redisTemplate.expire(redisKey, PRINTER_INDEX_EXPIRE_MINUTES, TimeUnit.MINUTES);
|
||||||
|
|
||||||
|
// 对打印机数量取模得到当前索引
|
||||||
|
int currentIndex = (int) ((incrementedValue - 1) % printers.length);
|
||||||
|
|
||||||
|
// 获取当前打印机
|
||||||
|
String selectedPrinter = printers[currentIndex].trim();
|
||||||
|
|
||||||
|
log.debug("打印机 {} 选择了第 {} 个打印机: {} (递增值: {})", printer.getId(), currentIndex, selectedPrinter, incrementedValue);
|
||||||
|
|
||||||
|
return selectedPrinter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user