Browse Source

REPORT-148261 支持远程设计连接断开后自动停止心跳与锁状态检测,避免服务器重启后产生大量连接报错。连接恢复后设计器自动重启相关任务。

release/11.0
Brian.Luo-罗旭 1 month ago
parent
commit
282f51dff6
  1. 70
      designer-base/src/main/java/com/fr/design/editlock/EditLockChangeChecker.java

70
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.WorkContext;
import com.fr.workspace.server.lock.editlock.EditLockOperator; import com.fr.workspace.server.lock.editlock.EditLockOperator;
import com.fr.report.LockItem; 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.ArrayList;
import java.util.List; import java.util.List;
@ -26,11 +31,63 @@ public abstract class EditLockChangeChecker {
protected LockItem lockItem; protected LockItem lockItem;
private boolean isLocked = false; private boolean isLocked = false;
private List<EditLockChangeListener> listeners = new ArrayList<>(); private List<EditLockChangeListener> listeners = new ArrayList<>();
private boolean running = false;
// 监听连接断开事件
private Listener<Workspace> disconnectListener = new Listener<Workspace>() {
@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<Workspace> connectListener = new Listener<Workspace>() {
@Override
public void on(Event event, Workspace workspace) {
if (running && scheduler == null) {
FineLoggerFactory.getLogger().info("Connection restored, restarting edit lock checker");
startScheduler();
}
}
};
/** /**
* 轮询任务如果是远程设计状态每隔30s查询一次相应lockItem的锁状态是否改变 * 轮询任务如果是远程设计状态每隔30s查询一次相应lockItem的锁状态是否改变
*/ */
public void start() { 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 = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("EditLockChangeChecker"));
this.scheduler.scheduleWithFixedDelay(new Runnable() { this.scheduler.scheduleWithFixedDelay(new Runnable() {
@Override @Override
@ -45,7 +102,7 @@ public abstract class EditLockChangeChecker {
fireChange(); fireChange();
} }
} catch (Exception e) { } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error("Edit lock check error: " + e.getMessage(), e);
} }
} else if (isLocked()){ } else if (isLocked()){
// 如果不是远程环境,且此前的远程状态下为锁定的话,切换回来后需要将其修改为不锁定 // 如果不是远程环境,且此前的远程状态下为锁定的话,切换回来后需要将其修改为不锁定
@ -57,7 +114,16 @@ public abstract class EditLockChangeChecker {
} }
public void stop() { 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) { public void addEditLockChangeListener(EditLockChangeListener listener) {

Loading…
Cancel
Save