From 282f51dff6d1cbbdc17a942c5c8960e5f3b6dd9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brian=2ELuo-=E7=BD=97=E6=97=AD?= Date: Tue, 8 Apr 2025 10:02:46 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-148261=20=E6=94=AF=E6=8C=81=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E8=AE=BE=E8=AE=A1=E8=BF=9E=E6=8E=A5=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E5=81=9C=E6=AD=A2=E5=BF=83=E8=B7=B3?= =?UTF-8?q?=E4=B8=8E=E9=94=81=E7=8A=B6=E6=80=81=E6=A3=80=E6=B5=8B=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=87=8D=E5=90=AF?= =?UTF-8?q?=E5=90=8E=E4=BA=A7=E7=94=9F=E5=A4=A7=E9=87=8F=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E3=80=82=E8=BF=9E=E6=8E=A5=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E5=90=8E=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=87=AA=E5=8A=A8=E9=87=8D?= =?UTF-8?q?=E5=90=AF=E7=9B=B8=E5=85=B3=E4=BB=BB=E5=8A=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editlock/EditLockChangeChecker.java | 70 ++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/editlock/EditLockChangeChecker.java b/designer-base/src/main/java/com/fr/design/editlock/EditLockChangeChecker.java index cb4d5550f7..1d41f9d88e 100644 --- a/designer-base/src/main/java/com/fr/design/editlock/EditLockChangeChecker.java +++ b/designer-base/src/main/java/com/fr/design/editlock/EditLockChangeChecker.java @@ -6,6 +6,11 @@ import com.fr.log.FineLoggerFactory; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.editlock.EditLockOperator; import com.fr.report.LockItem; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.workspace.Workspace; +import com.fr.workspace.WorkspaceEvent; import java.util.ArrayList; import java.util.List; @@ -26,11 +31,63 @@ public abstract class EditLockChangeChecker { protected LockItem lockItem; private boolean isLocked = false; private List listeners = new ArrayList<>(); + private boolean running = false; + + // 监听连接断开事件 + private Listener disconnectListener = new Listener() { + @Override + public void on(Event event, Workspace workspace) { + if (scheduler != null && !scheduler.isShutdown()) { + scheduler.shutdown(); + scheduler = null; + FineLoggerFactory.getLogger().info("Connection lost, edit lock checker stopped"); + } + } + }; + + // 监听连接恢复事件 + private Listener connectListener = new Listener() { + @Override + public void on(Event event, Workspace workspace) { + if (running && scheduler == null) { + FineLoggerFactory.getLogger().info("Connection restored, restarting edit lock checker"); + startScheduler(); + } + } + }; /** * 轮询任务,如果是远程设计状态,每隔30s查询一次相应lockItem的锁状态是否改变 */ public void start() { + running = true; + startListeners(); + startScheduler(); + } + + /** + * 启动事件监听器 + */ + private void startListeners() { + if (!WorkContext.getCurrent().isLocal()) { + // 确保不会重复注册 + EventDispatcher.stopListen(disconnectListener); + EventDispatcher.stopListen(connectListener); + + EventDispatcher.listen(WorkspaceEvent.LostConnect, disconnectListener); + EventDispatcher.listen(WorkspaceEvent.ConnectSuccess, connectListener); + } + } + + /** + * 启动调度器 + */ + private void startScheduler() { + // 已经有调度器运行中,不需要重新创建 + if (scheduler != null && !scheduler.isShutdown()) { + return; + } + this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("EditLockChangeChecker")); this.scheduler.scheduleWithFixedDelay(new Runnable() { @Override @@ -45,7 +102,7 @@ public abstract class EditLockChangeChecker { fireChange(); } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error("Edit lock check error: " + e.getMessage(), e); } } else if (isLocked()){ // 如果不是远程环境,且此前的远程状态下为锁定的话,切换回来后需要将其修改为不锁定 @@ -57,7 +114,16 @@ public abstract class EditLockChangeChecker { } public void stop() { - this.scheduler.shutdown(); + running = false; + // 移除事件监听 + EventDispatcher.stopListen(disconnectListener); + EventDispatcher.stopListen(connectListener); + + // 关闭调度器 + if (this.scheduler != null && !this.scheduler.isShutdown()) { + this.scheduler.shutdown(); + this.scheduler = null; + } } public void addEditLockChangeListener(EditLockChangeListener listener) {