Browse Source
Merge in DESIGN/design from ~ROGER.CHEN/design:feature/x to feature/x * commit '1b33fedef80097a538385671d20c6de0a2152eaa': 修复代码问题 REPORT-99451 远程设计专项-功能侧优化-模板锁定优化feature/x
Roger.Chen-陈旺
1 year ago
6 changed files with 257 additions and 73 deletions
@ -0,0 +1,159 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.ui.util.UIUtil; |
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Listener; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.StableUtils; |
||||
import com.fr.third.org.apache.http.client.config.RequestConfig; |
||||
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||
import com.fr.third.org.apache.http.client.methods.HttpGet; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.Workspace; |
||||
import com.fr.workspace.WorkspaceEvent; |
||||
import com.fr.workspace.base.WorkspaceConstants; |
||||
import com.fr.workspace.connect.WorkspaceConnectionInfo; |
||||
import com.fr.workspace.engine.channel.WorkspaceChannelFactory; |
||||
import com.fr.workspace.engine.exception.WorkspaceConnectionException; |
||||
|
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.UIManager; |
||||
|
||||
/** |
||||
* RPC连接处理中心 |
||||
* |
||||
* @author Roger |
||||
* @since 11.0 |
||||
* Created on 2023/12/13 |
||||
*/ |
||||
public class RPCConnectHandlerCenter { |
||||
|
||||
private static volatile boolean alerting = false; |
||||
private static final int TIMEOUT = 5000; |
||||
|
||||
private static Listener<Workspace> listener = new Listener<Workspace>() { |
||||
@Override |
||||
public void on(Event event, Workspace workspace) { |
||||
//暂时先不做重连处理,3次RPC连接失败后提示切换工作目录
|
||||
showRPCDisconnectDialog(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 开启事件监听 |
||||
*/ |
||||
public static void startListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.listen(WorkspaceEvent.LostConnect, listener); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 弹窗提示连接断开 |
||||
*/ |
||||
public static void showRPCDisconnectDialog() { |
||||
UIUtil.invokeLaterIfNeeded(RPCConnectHandlerCenter::showDialog); |
||||
} |
||||
|
||||
/** |
||||
* RPC连接测试 |
||||
* |
||||
* @param info 连接信息 |
||||
* @return 是否连接成功 |
||||
*/ |
||||
public static boolean checkRPCConnect(WorkspaceConnectionInfo info) { |
||||
try { |
||||
return WorkspaceChannelFactory.testConnection(info); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e, e.getMessage()); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* http连接检测,从DesignerSocketIO中移过来的,先保留着 |
||||
* |
||||
* @param info 连接信息 |
||||
* @return 是否连接成功 |
||||
*/ |
||||
public static boolean checkHttpConnect(WorkspaceConnectionInfo info) { |
||||
CloseableHttpClient httpclient = HttpClients.createDefault(); |
||||
HttpGet httpGet = new HttpGet(StableUtils.pathJoin(info.getUrl(), WorkspaceConstants.CONTROLLER_PREFIX, WorkspaceConstants.VT)); |
||||
RequestConfig requestConfig = RequestConfig |
||||
.custom() |
||||
.setConnectTimeout(TIMEOUT) |
||||
.setConnectionRequestTimeout(TIMEOUT) |
||||
.build(); |
||||
httpGet.setConfig(requestConfig); |
||||
try { |
||||
CloseableHttpResponse response = httpclient.execute(httpGet); |
||||
if (isErrorStatus(response.getStatusLine().getStatusCode())) { |
||||
//这边nginx做负载,服务器被kill掉,返回的是502,不会抛错,导致checkRPCConnect通过
|
||||
//针对500-600的错误码加个判断,其他类型的状态码暂不考虑,如果有遇到再处理,不然怕影响范围大
|
||||
throw new WorkspaceConnectionException("Response " + response.getStatusLine().toString()); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e, e.getMessage()); |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* 提示连接已经断开,如果已经在提示中了就直接返回 |
||||
*/ |
||||
private static void showDialog() { |
||||
if (alerting) { |
||||
return; |
||||
} |
||||
synchronized (RPCConnectHandlerCenter.class) { |
||||
if (alerting) { |
||||
return; |
||||
} |
||||
alerting = true; |
||||
try { |
||||
FineJOptionPane.showMessageDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"), |
||||
UIManager.getString("OptionPane.messageDialogTitle"), |
||||
JOptionPane.ERROR_MESSAGE, |
||||
UIManager.getIcon("OptionPane.errorIcon")); |
||||
EnvChangeEntrance.getInstance().chooseEnv(); |
||||
} finally { |
||||
alerting = false; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 错误状态码 |
||||
* 5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。代码 说明 |
||||
* 500 (服务器内部错误) 服务器遇到错误,无法完成请求。 |
||||
* 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 |
||||
* 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 |
||||
* 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 |
||||
* 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 |
||||
* 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。 |
||||
* |
||||
* @param status 错误状态码 |
||||
* @return 是否是错误状态码 |
||||
*/ |
||||
private static boolean isErrorStatus(int status) { |
||||
return status >= 500 && status <= 600; |
||||
} |
||||
|
||||
/** |
||||
* 停止事件监听 |
||||
*/ |
||||
public static void stopListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.stopListen(listener); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.lock; |
||||
|
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Listener; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.report.lock.LockInfoOperator; |
||||
import com.fr.stable.collections.CollectionUtils; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.Workspace; |
||||
import com.fr.workspace.WorkspaceEvent; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 更新模板锁信息 |
||||
* |
||||
* @author Roger |
||||
* @since 11.0 |
||||
* Created on 2023/12/11 |
||||
*/ |
||||
public class TemplateLockInfoReSave { |
||||
|
||||
private static Listener<Workspace> listener = new Listener<Workspace>() { |
||||
@Override |
||||
public void on(Event event, Workspace workspace) { |
||||
List<JTemplate<?, ?>> templates = HistoryTemplateListCache.getInstance().getHistoryList(); |
||||
if (CollectionUtils.isEmpty(templates)) { |
||||
return; |
||||
} |
||||
String[] paths = templates.stream().map(JTemplate::getPath).toArray(String[]::new); |
||||
String[] lockedPath = WorkContext.getCurrent().get(LockInfoOperator.class).lockTemplates(paths); |
||||
FineLoggerFactory.getLogger().warn("template lock failed:{}", String.join(";", lockedPath)); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 启动监听 |
||||
*/ |
||||
public static void startListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.listen(WorkspaceEvent.ConnectSuccess, listener); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 停止事件监听 |
||||
*/ |
||||
public static void stopListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.stopListen(listener); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue