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) {