@ -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 ( ) {
running = false ;
// 移除事件监听
EventDispatcher . stopListen ( disconnectListener ) ;
EventDispatcher . stopListen ( connectListener ) ;
// 关闭调度器
if ( this . scheduler ! = null & & ! this . scheduler . isShutdown ( ) ) {
this . scheduler . shutdown ( ) ;
this . scheduler . shutdown ( ) ;
this . scheduler = null ;
}
}
}
public void addEditLockChangeListener ( EditLockChangeListener listener ) {
public void addEditLockChangeListener ( EditLockChangeListener listener ) {