|
|
|
@ -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<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的锁状态是否改变 |
|
|
|
|
*/ |
|
|
|
|
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() { |
|
|
|
|
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) { |
|
|
|
|