From 929332664363a6e496fa0367b08aa2c3689ad8fe Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 24 四月 2026 21:58:15 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0
---
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java
index c05b9a1..d03234f 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java
@@ -22,6 +22,7 @@
public class ElectronicFenceFailureCompensationTask {
private static final String LOCK_KEY = "MAP:ELECTRONIC_FENCE:FAILURE_COMPENSATE";
+ private static final String LOCK_KEY_ENABLE = "MAP:ELECTRONIC_FENCE:ENABLE_COMPENSATE";
private static final int LOCK_WAIT_SECONDS = 0;
private static final int LOCK_LEASE_SECONDS = 15;
@@ -31,6 +32,10 @@
@Resource
private RedissonClient redissonClient;
+
+ /**
+ * 定时任务 围栏失效补偿定时任务
+ */
@Scheduled(fixedDelay = 10 * 1000L)
public void compensateExpiredFence() {
RLock lock = redissonClient.getLock(LOCK_KEY);
@@ -78,4 +83,52 @@
}
}
}
+
+ /**
+ * 围栏启动偿定时任务
+ */
+ @Scheduled(fixedDelay = 10 * 1000L)
+ public void compensateEnableFence() {
+ RLock lock = redissonClient.getLock(LOCK_KEY_ENABLE);
+ boolean locked = false;
+ try {
+ locked = lock.tryLock(LOCK_WAIT_SECONDS, LOCK_LEASE_SECONDS, TimeUnit.SECONDS);
+ if (!locked) {
+ return;
+ }
+ List<XpElectronicFence> expiredFenceList = xpElectronicFenceService.lambdaQuery()
+ .eq(XpElectronicFence::getDeleted, 0)
+ .eq(XpElectronicFence::getStatus, 1)//围栏状态 0=草稿 1=待启用 2=启用中 3=已停用
+ .ge(XpElectronicFence::getFailureTime, LocalDateTime.now())//当前时间小于生效时间
+ .list();
+ if (expiredFenceList == null || expiredFenceList.isEmpty()) {
+ return;
+ }
+ List<Long> electronicIds = expiredFenceList.stream()
+ .map(XpElectronicFence::getId)
+ .collect(Collectors.toList());
+ log.info("电子围栏失效补偿开始, count={}, ids={}", electronicIds.size(), electronicIds);
+ for (Long electronicId : electronicIds) {
+ try {
+ xpElectronicFenceService.enableFence(electronicId);
+ } catch (Exception e) {
+ log.error("电子围栏失效补偿单条处理异常, electronicId={}", electronicId, e);
+ }
+ }
+ log.info("电子围栏失效补偿完成, count={}, ids={}", electronicIds.size(), electronicIds);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ log.warn("电子围栏失效补偿任务获取锁被中断", e);
+ } catch (Exception e) {
+ log.error("电子围栏失效补偿任务执行异常", e);
+ } finally {
+ try {
+ if (locked && lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ } catch (Exception e) {
+ log.warn("释放电子围栏失效补偿锁失败 lockKey={}", LOCK_KEY, e);
+ }
+ }
+ }
}
--
Gitblit v1.7.1