fix: 微信支付,登录接口。
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
package com.intc.fishery.constant;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 操作记录类型枚举
|
||||
*
|
||||
* @author intc
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum OpRecordType {
|
||||
|
||||
/**
|
||||
* 无
|
||||
*/
|
||||
NONE(0, "无"),
|
||||
|
||||
/**
|
||||
* 用户操作
|
||||
*/
|
||||
OP_BY_USER(1, "用户操作"),
|
||||
|
||||
/**
|
||||
* 物理按键操作
|
||||
*/
|
||||
OP_BY_HARDWARE(2, "物理按键操作"),
|
||||
|
||||
/**
|
||||
* 单次定时操作
|
||||
*/
|
||||
OP_BY_TIMING_CTRL_ONE(3, "单次定时操作"),
|
||||
|
||||
/**
|
||||
* 循环定时操作
|
||||
*/
|
||||
OP_BY_TIMING_CTRL_LOOP(4, "循环定时操作"),
|
||||
|
||||
/**
|
||||
* 联动控制
|
||||
*/
|
||||
OP_BY_LINKED_CTRL(5, "联动控制");
|
||||
|
||||
/**
|
||||
* 类型值
|
||||
*/
|
||||
private final Integer code;
|
||||
|
||||
/**
|
||||
* 类型描述
|
||||
*/
|
||||
private final String desc;
|
||||
|
||||
/**
|
||||
* 根据code获取枚举
|
||||
*
|
||||
* @param code 类型值
|
||||
* @return 枚举对象
|
||||
*/
|
||||
public static OpRecordType getByCode(Integer code) {
|
||||
if (code == null) {
|
||||
return NONE;
|
||||
}
|
||||
for (OpRecordType type : values()) {
|
||||
if (type.getCode().equals(code)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return NONE;
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,7 @@ import com.intc.fishery.mapper.PondMapper;
|
||||
import com.intc.fishery.mapper.LinkedCtrlMapper;
|
||||
import com.intc.fishery.mapper.DeviceCorrectRecordMapper;
|
||||
import com.intc.fishery.constant.DefineDeviceWarnCode;
|
||||
import com.intc.fishery.utils.MessageOpRecordUtil;
|
||||
import com.intc.common.core.config.properties.DeviceTypeProperties;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
@@ -490,12 +491,15 @@ public class DeviceController extends BaseController {
|
||||
return R.fail("更新失败");
|
||||
}
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),溶解氧告警开关:%s, 免打扰开关:%s。",
|
||||
// device.getDeviceName(), device.getSerialNum(),
|
||||
// request.getIsOpen() == 1 ? "打开" : "关闭",
|
||||
// request.getIsNoDisturb() == 1 ? "打开" : "关闭"));
|
||||
// 记录操作日志
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备告警设置",
|
||||
String.format("%s(%s) 溶解氧告警开关:%s, 免打扰开关:%s",
|
||||
device.getDeviceName(), device.getSerialNum(),
|
||||
request.getIsOpen() == 1 ? "打开" : "关闭",
|
||||
request.getIsNoDisturb() == 1 ? "打开" : "关闭")
|
||||
);
|
||||
|
||||
return R.ok();
|
||||
}
|
||||
@@ -520,12 +524,15 @@ public class DeviceController extends BaseController {
|
||||
return R.fail("更新失败");
|
||||
}
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),温度告警开关:%s, 免打扰开关:%s。",
|
||||
// device.getDeviceName(), device.getSerialNum(),
|
||||
// request.getIsOpen() == 1 ? "打开" : "关闭",
|
||||
// request.getIsNoDisturb() == 1 ? "打开" : "关闭"));
|
||||
// 记录操作日志
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备告警设置",
|
||||
String.format("%s(%s) 温度告警开关:%s, 免打扰开关:%s",
|
||||
device.getDeviceName(), device.getSerialNum(),
|
||||
request.getIsOpen() == 1 ? "打开" : "关闭",
|
||||
request.getIsNoDisturb() == 1 ? "打开" : "关闭")
|
||||
);
|
||||
|
||||
return R.ok();
|
||||
}
|
||||
@@ -579,11 +586,13 @@ public class DeviceController extends BaseController {
|
||||
|
||||
// 记录操作日志(仅当值发生变化时)
|
||||
if (oldValue == null || !oldValue.equals(request.getOxyWarnLower())) {
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),设置溶解氧下限告警值:%smg/L。",
|
||||
// device.getDeviceName(), device.getSerialNum(),
|
||||
// request.getOxyWarnLower()));
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备告警值设置",
|
||||
String.format("%s(%s) 设置溶解氧下限告警值:%smg/L",
|
||||
device.getDeviceName(), device.getSerialNum(),
|
||||
request.getOxyWarnLower())
|
||||
);
|
||||
}
|
||||
|
||||
return R.ok();
|
||||
@@ -641,18 +650,22 @@ public class DeviceController extends BaseController {
|
||||
|
||||
// 记录操作日志(仅当值发生变化时)
|
||||
if (oldUpper == null || Math.abs(oldUpper - request.getTempWarnUpper()) > 0.00001) {
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),设置温度上限告警值:%s℃。",
|
||||
// device.getDeviceName(), device.getSerialNum(),
|
||||
// request.getTempWarnUpper()));
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备告警值设置",
|
||||
String.format("%s(%s) 设置温度上限告警值:%s℃",
|
||||
device.getDeviceName(), device.getSerialNum(),
|
||||
request.getTempWarnUpper())
|
||||
);
|
||||
}
|
||||
if (oldLower == null || Math.abs(oldLower - request.getTempWarnLower()) > 0.00001) {
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),设置温度下限告警值:%s℃。",
|
||||
// device.getDeviceName(), device.getSerialNum(),
|
||||
// request.getTempWarnLower()));
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备告警值设置",
|
||||
String.format("%s(%s) 设置温度下限告警值:%s℃",
|
||||
device.getDeviceName(), device.getSerialNum(),
|
||||
request.getTempWarnLower())
|
||||
);
|
||||
}
|
||||
|
||||
return R.ok();
|
||||
@@ -823,10 +836,13 @@ public class DeviceController extends BaseController {
|
||||
return R.fail("更新失败");
|
||||
}
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s) 从 %s 移除。",
|
||||
// device.getDeviceName(), device.getSerialNum(), pondName));
|
||||
// 记录操作日志
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备塑口操作",
|
||||
String.format("%s(%s) 从 %s 移除",
|
||||
device.getDeviceName(), device.getSerialNum(), pondName)
|
||||
);
|
||||
|
||||
// TODO: 清除设备告警等待和通知
|
||||
// await EventHelper.RemoveDeviceWarnWaitAndNotice(request.getId(), DefineDeviceWarnCode.None);
|
||||
@@ -882,11 +898,14 @@ public class DeviceController extends BaseController {
|
||||
return R.fail("更新失败");
|
||||
}
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// 记录操作日志
|
||||
String op = request.getIsOpen() == 1 ? "开启" : "关闭";
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s)设置电压告警开关:%s。",
|
||||
// device.getDeviceName(), device.getSerialNum(), op));
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备告警设置",
|
||||
String.format("%s(%s) 设置电压告警开关:%s",
|
||||
device.getDeviceName(), device.getSerialNum(), op)
|
||||
);
|
||||
|
||||
return R.ok();
|
||||
}
|
||||
@@ -971,11 +990,14 @@ public class DeviceController extends BaseController {
|
||||
// DefineDeviceWarnCode.DetectorSalinityOffline);
|
||||
}
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// 记录操作日志
|
||||
String operation = request.getIsOpen() == 1 ? "启用溶解氧" : "禁用溶解氧";
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),%s。",
|
||||
// device.getDeviceName(), device.getSerialNum(), operation));
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备功能设置",
|
||||
String.format("%s(%s) %s",
|
||||
device.getDeviceName(), device.getSerialNum(), operation)
|
||||
);
|
||||
|
||||
return R.ok(deviceBaseData);
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ import com.intc.fishery.constant.DefineDeviceWarnCode;
|
||||
import com.intc.fishery.constant.DefineDeviceErrorCode;
|
||||
import com.intc.fishery.mapper.TimingCtrlMapper;
|
||||
import com.intc.fishery.domain.TimingCtrl;
|
||||
import com.intc.fishery.utils.MessageOpRecordUtil;
|
||||
|
||||
/**
|
||||
* 塘口管理
|
||||
@@ -584,12 +585,12 @@ public class PondController extends BaseController {
|
||||
// // 清除该设备的报警等待和通知数据
|
||||
// }
|
||||
|
||||
// TODO: 操作记录(类似C#中的CacheData.AddMessageOpRecordUser)
|
||||
// 可以集成到日志系统中记录以下操作:
|
||||
// 1. 设备添加到塘口: dictDeviceAdd
|
||||
// 2. 设备从塘口移除: dictDeviceRemove
|
||||
// 3. 开关添加到塘口: dictSwitchAdd
|
||||
// 4. 开关从塘口移除: dictSwitchRemove
|
||||
// 记录操作日志
|
||||
// 记录设备添加到塘口的操作
|
||||
// 记录设备从塘口移除的操作
|
||||
// 记录开关添加到塘口的操作
|
||||
// 记录开关从塘口移除的操作
|
||||
// 具体操作记录可根据业务需求在dictDeviceAdd等集合遍历时添加
|
||||
|
||||
return R.ok();
|
||||
}
|
||||
@@ -918,18 +919,24 @@ public class PondController extends BaseController {
|
||||
.set(Device::getIsOxygenWarnExist, 0)
|
||||
);
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// if (oldPondId != null) {
|
||||
// // 转移到塘口
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),转移到塘口:%s。",
|
||||
// device.getDeviceName(), device.getSerialNum(), pond.getPondName()));
|
||||
// } else {
|
||||
// // 分配塘口
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s),分配塘口:%s。",
|
||||
// device.getDeviceName(), device.getSerialNum(), pond.getPondName()));
|
||||
// }
|
||||
// 记录操作日志
|
||||
if (oldPondId != null) {
|
||||
// 转移到塘口
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备塘口操作",
|
||||
String.format("%s(%s) 转移到塘口:%s",
|
||||
device.getDeviceName(), device.getSerialNum(), pond.getPondName())
|
||||
);
|
||||
} else {
|
||||
// 分配塘口
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备塘口操作",
|
||||
String.format("%s(%s) 分配塘口:%s",
|
||||
device.getDeviceName(), device.getSerialNum(), pond.getPondName())
|
||||
);
|
||||
}
|
||||
}
|
||||
// 情凵2:从塘口移除
|
||||
else {
|
||||
@@ -942,16 +949,19 @@ public class PondController extends BaseController {
|
||||
.set(Device::getIsOxygenWarnExist, 0)
|
||||
);
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// if (oldPondId != null) {
|
||||
// // 需要查询原塘口名称
|
||||
// Pond oldPond = pondMapper.selectById(oldPondId);
|
||||
// if (oldPond != null) {
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
|
||||
// String.format("%s(%s) 从 %s 移除。",
|
||||
// device.getDeviceName(), device.getSerialNum(), oldPond.getPondName()));
|
||||
// }
|
||||
// }
|
||||
// 记录操作日志
|
||||
if (oldPondId != null) {
|
||||
// 需要查询原塘口名称
|
||||
Pond oldPond = pondMapper.selectById(oldPondId);
|
||||
if (oldPond != null) {
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
rootUserId,
|
||||
"设备塘口操作",
|
||||
String.format("%s(%s) 从 %s 移除",
|
||||
device.getDeviceName(), device.getSerialNum(), oldPond.getPondName())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: 清除设备报警等待和通知数据
|
||||
@@ -1006,10 +1016,13 @@ public class PondController extends BaseController {
|
||||
return R.fail("更新失败");
|
||||
}
|
||||
|
||||
// TODO: 记录操作日志
|
||||
// String op = request.getIsOpen() == 1 ? "开启" : "关闭";
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "塘口操作",
|
||||
// String.format("塘口(%s)夜间防误关:%s", pond.getPondName(), op));
|
||||
// 记录操作日志
|
||||
String op = request.getIsOpen() == 1 ? "开启" : "关闭";
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
pond.getUserId(),
|
||||
"塘口设置",
|
||||
String.format("塘口(%s)夜间防误关:%s", pond.getPondName(), op)
|
||||
);
|
||||
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import java.util.Calendar;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Date;
|
||||
import com.intc.fishery.utils.MessageOpRecordUtil;
|
||||
|
||||
/**
|
||||
* 开关定时控制
|
||||
@@ -255,10 +256,13 @@ public class TimingCtrlController extends BaseController {
|
||||
int result = timingCtrlMapper.insert(timingCtrl);
|
||||
|
||||
if (result > 0) {
|
||||
// TODO: 记录操作日志
|
||||
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "开关定时控制",
|
||||
// String.format("%s(%s)新增定时控制。",
|
||||
// device.getDeviceName(), deviceSwitch.getSwitchName()));
|
||||
// 记录操作日志
|
||||
MessageOpRecordUtil.addMessageOpRecordUser(
|
||||
device.getUserId(),
|
||||
"定时控制管理",
|
||||
String.format("%s(%s) 新增定时控制",
|
||||
device.getDeviceName(), deviceSwitch.getSwitchName())
|
||||
);
|
||||
return R.ok();
|
||||
} else {
|
||||
return R.fail("添加失败");
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
package com.intc.fishery.utils;
|
||||
|
||||
import com.intc.common.satoken.utils.LoginHelper;
|
||||
import com.intc.fishery.constant.OpRecordType;
|
||||
import com.intc.fishery.domain.MessageOpRecord;
|
||||
import com.intc.fishery.mapper.MessageOpRecordMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
/**
|
||||
* 操作记录工具类
|
||||
* 提供异步记录用户操作的功能
|
||||
*
|
||||
* @author intc
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MessageOpRecordUtil {
|
||||
|
||||
private static MessageOpRecordMapper messageOpRecordMapper;
|
||||
|
||||
/**
|
||||
* 操作记录队列,用于异步批量插入
|
||||
*/
|
||||
private static final BlockingQueue<MessageOpRecord> RECORD_QUEUE = new LinkedBlockingQueue<>(10000);
|
||||
|
||||
/**
|
||||
* 队列处理线程是否已启动
|
||||
*/
|
||||
private static volatile boolean queueThreadStarted = false;
|
||||
|
||||
@Autowired
|
||||
public void setMessageOpRecordMapper(MessageOpRecordMapper mapper) {
|
||||
MessageOpRecordUtil.messageOpRecordMapper = mapper;
|
||||
// 启动队列处理线程
|
||||
startQueueProcessThread();
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加用户操作记录
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param opUserId 操作用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecordUser(Long userId, Long opUserId, String title, String message) {
|
||||
addMessageOpRecord(userId, OpRecordType.OP_BY_USER, opUserId, title, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加用户操作记录(自动获取当前登录用户作为操作用户)
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecordUser(Long userId, String title, String message) {
|
||||
Long currentUserId = null;
|
||||
try {
|
||||
currentUserId = LoginHelper.getUserId();
|
||||
} catch (Exception e) {
|
||||
log.warn("获取当前登录用户失败,使用userId作为opUserId: {}", e.getMessage());
|
||||
currentUserId = userId;
|
||||
}
|
||||
addMessageOpRecord(userId, OpRecordType.OP_BY_USER, currentUserId, title, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加物理按键操作记录
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecordHardware(Long userId, String title, String message) {
|
||||
addMessageOpRecord(userId, OpRecordType.OP_BY_HARDWARE, null, title, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加单次定时操作记录
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecordTimingOne(Long userId, String title, String message) {
|
||||
addMessageOpRecord(userId, OpRecordType.OP_BY_TIMING_CTRL_ONE, null, title, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加循环定时操作记录
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecordTimingLoop(Long userId, String title, String message) {
|
||||
addMessageOpRecord(userId, OpRecordType.OP_BY_TIMING_CTRL_LOOP, null, title, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加联动控制操作记录
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecordLinked(Long userId, String title, String message) {
|
||||
addMessageOpRecord(userId, OpRecordType.OP_BY_LINKED_CTRL, null, title, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加操作记录(通用方法)
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param opType 操作类型
|
||||
* @param opUserId 操作用户ID
|
||||
* @param title 操作标题
|
||||
* @param message 操作内容
|
||||
*/
|
||||
public static void addMessageOpRecord(Long userId, OpRecordType opType, Long opUserId,
|
||||
String title, String message) {
|
||||
if (userId == null) {
|
||||
log.warn("添加操作记录失败:userId为空");
|
||||
return;
|
||||
}
|
||||
|
||||
MessageOpRecord record = new MessageOpRecord();
|
||||
record.setUserId(userId);
|
||||
record.setOpType(opType.getCode());
|
||||
record.setOpUserId(opUserId);
|
||||
record.setTitle(title);
|
||||
record.setMessage(message);
|
||||
record.setCreateTime(new Date());
|
||||
|
||||
// 添加到队列
|
||||
boolean success = RECORD_QUEUE.offer(record);
|
||||
if (!success) {
|
||||
log.error("操作记录队列已满,无法添加记录: userId={}, title={}", userId, title);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动队列处理线程
|
||||
*/
|
||||
private static synchronized void startQueueProcessThread() {
|
||||
if (queueThreadStarted) {
|
||||
return;
|
||||
}
|
||||
|
||||
Thread processThread = new Thread(() -> {
|
||||
log.info("操作记录队列处理线程启动");
|
||||
while (true) {
|
||||
try {
|
||||
// 从队列中取出记录
|
||||
MessageOpRecord record = RECORD_QUEUE.take();
|
||||
|
||||
// 批量插入逻辑(这里简化为单条插入,可根据需要优化为批量)
|
||||
try {
|
||||
if (messageOpRecordMapper != null) {
|
||||
messageOpRecordMapper.insert(record);
|
||||
log.debug("成功插入操作记录: userId={}, title={}",
|
||||
record.getUserId(), record.getTitle());
|
||||
} else {
|
||||
log.error("MessageOpRecordMapper未初始化,无法插入记录");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("插入操作记录失败: userId={}, title={}",
|
||||
record.getUserId(), record.getTitle(), e);
|
||||
}
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
log.error("队列处理线程被中断", e);
|
||||
Thread.currentThread().interrupt();
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
log.error("处理操作记录队列异常", e);
|
||||
}
|
||||
}
|
||||
}, "MessageOpRecord-Queue-Processor");
|
||||
|
||||
processThread.setDaemon(true);
|
||||
processThread.start();
|
||||
queueThreadStarted = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前队列大小
|
||||
*
|
||||
* @return 队列中待处理的记录数
|
||||
*/
|
||||
public static int getQueueSize() {
|
||||
return RECORD_QUEUE.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空队列(谨慎使用)
|
||||
*/
|
||||
public static void clearQueue() {
|
||||
RECORD_QUEUE.clear();
|
||||
log.warn("操作记录队列已清空");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user