Browse Source
Merge in DESIGN/design from ~HARRISON/design:feature/x to feature/x * commit '0c20e0c051f72b7ee5d19f5fd6006b8c3c116ab1': REPORT-73318【设计器环境监测】服务器finedb有脏数据,设计器远程切换,过程很慢且没有自动监测弹窗 1-简化操作,不区分 设计器/服务器 启动。只在设计器启动后进行检测 2-切换环境的检测。切换环境后上次的任务需要停止执行。 3-FineDB 检测从捕获检测,切换到全量检测feature/x
Harrison
2 years ago
3 changed files with 138 additions and 183 deletions
@ -1,22 +1,106 @@ |
|||||||
package com.fr.env.detect.impl; |
package com.fr.env.detect.impl; |
||||||
|
|
||||||
import com.fr.env.detect.base.CatchExceptionDetector; |
import com.fr.config.ConfigContext; |
||||||
|
import com.fr.config.Configuration; |
||||||
|
import com.fr.design.dialog.FineJOptionPane; |
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.env.detect.base.AbstractExceptionDetector; |
||||||
|
import com.fr.env.detect.base.DetectorConstants; |
||||||
|
import com.fr.env.detect.bean.DetectorResult; |
||||||
import com.fr.env.detect.bean.DetectorType; |
import com.fr.env.detect.bean.DetectorType; |
||||||
import com.fr.env.detect.impl.converter.FineDbDirtyConverter; |
import com.fr.env.detect.bean.ExceptionSolution; |
||||||
import com.fr.env.detect.thowable.ThrowableStore; |
import com.fr.env.detect.bean.Message; |
||||||
|
import com.fr.env.detect.bean.SolutionAction; |
||||||
|
import com.fr.io.utils.ResourceIOUtils; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.stable.StableUtils; |
||||||
|
import com.fr.stable.project.ProjectConstants; |
||||||
|
import com.fr.third.org.hibernate.exception.GenericJDBCException; |
||||||
|
|
||||||
|
import javax.swing.JOptionPane; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.function.Function; |
||||||
|
|
||||||
/** |
/** |
||||||
* created by Harrison on 2022/05/25 |
* created by Harrison on 2022/05/25 |
||||||
**/ |
**/ |
||||||
public class FineDbDirtyDetector extends CatchExceptionDetector { |
public class FineDbDirtyDetector extends AbstractExceptionDetector { |
||||||
|
|
||||||
public FineDbDirtyDetector() { |
public FineDbDirtyDetector() { |
||||||
this(ThrowableStore.getInstance()); |
|
||||||
|
super(DetectorType.FINE_DB_DIRTY); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public DetectorResult detect() { |
||||||
|
|
||||||
|
Iterator<String> tableNames = ConfigContext.getConfigNames(); |
||||||
|
while (tableNames.hasNext()) { |
||||||
|
String tableName = tableNames.next(); |
||||||
|
Class<? extends Configuration> configClass = ConfigContext.getConfigClass(tableName); |
||||||
|
Configuration configuration = ConfigContext.getConfigInstance(configClass); |
||||||
|
try { |
||||||
|
|
||||||
|
// 尝试获取每一个值
|
||||||
|
configuration.mirror(); |
||||||
|
} catch (Throwable e) { |
||||||
|
|
||||||
|
Function<Throwable, Boolean> isDirtyExFunction = throwable -> { |
||||||
|
while (throwable != null) { |
||||||
|
if (throwable instanceof GenericJDBCException) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
throwable = throwable.getCause(); |
||||||
} |
} |
||||||
|
return false; |
||||||
|
}; |
||||||
|
boolean isDirtyEx = isDirtyExFunction.apply(e); |
||||||
|
|
||||||
public FineDbDirtyDetector(ThrowableStore throwableStore) { |
if (isDirtyEx) { |
||||||
|
DetectorType detectorType = DetectorType.FINE_DB_DIRTY; |
||||||
|
DetectorResult.DetectorResultBuilder builder = DetectorResult |
||||||
|
.builder() |
||||||
|
.withType(detectorType); |
||||||
|
|
||||||
super(DetectorType.FINE_DB_DIRTY, throwableStore, new FineDbDirtyConverter()); |
String tipsLocale = Toolkit.i18nText(detectorType.getTipsLocale(), tableName); |
||||||
|
|
||||||
|
String solutionLocale = detectorType.getSolutionLocale(); |
||||||
|
ExceptionSolution exceptionSolution = new ExceptionSolution(new Message.Link(Toolkit.i18nText(solutionLocale, DetectorConstants.FINE_DB_HELP_LINK), DetectorConstants.FINE_DB_HELP_LINK), new SolutionAction() { |
||||||
|
@Override |
||||||
|
public String name() { |
||||||
|
return Toolkit.i18nText("Fine-Design_Basic_Reset_Immediately"); |
||||||
} |
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
boolean success = false; |
||||||
|
try { |
||||||
|
ResourceIOUtils.copy(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME), |
||||||
|
StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_BAK_NAME)); |
||||||
|
success = ResourceIOUtils.delete(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME)); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
// todo 最好的逻辑是,这里应该和 UI 隔离开的
|
||||||
|
if (!success) { |
||||||
|
FineJOptionPane.showMessageDialog(null, |
||||||
|
Toolkit.i18nText("Fine-Design_Error_Finedb_Backup_Reset_Result", |
||||||
|
ResourceIOUtils.getRealPath(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME))), |
||||||
|
Toolkit.i18nText("Fine-Design_Basic_Error"), |
||||||
|
JOptionPane.ERROR_MESSAGE); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
builder.withTips(tipsLocale) |
||||||
|
.withSolution(exceptionSolution) |
||||||
|
.withLog(Toolkit.i18nText(detectorType.getLogLocale(), tableName)); |
||||||
|
|
||||||
|
return builder.build(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return DetectorResult.normal(DetectorType.FINE_DB_DIRTY); |
||||||
|
} |
||||||
} |
} |
||||||
|
@ -1,110 +0,0 @@ |
|||||||
package com.fr.env.detect.impl.converter; |
|
||||||
|
|
||||||
import com.fr.config.ConfigContext; |
|
||||||
import com.fr.config.Configuration; |
|
||||||
import com.fr.design.dialog.FineJOptionPane; |
|
||||||
import com.fr.design.i18n.Toolkit; |
|
||||||
import com.fr.env.detect.base.DetectorConstants; |
|
||||||
import com.fr.env.detect.bean.DetectorResult; |
|
||||||
import com.fr.env.detect.bean.DetectorType; |
|
||||||
import com.fr.env.detect.bean.ExceptionSolution; |
|
||||||
import com.fr.env.detect.bean.Message; |
|
||||||
import com.fr.env.detect.bean.SolutionAction; |
|
||||||
import com.fr.env.detect.thowable.ThrowableConverter; |
|
||||||
import com.fr.io.utils.ResourceIOUtils; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.stable.StableUtils; |
|
||||||
import com.fr.stable.project.ProjectConstants; |
|
||||||
import com.fr.third.org.hibernate.exception.GenericJDBCException; |
|
||||||
import org.jetbrains.annotations.Nullable; |
|
||||||
|
|
||||||
import javax.swing.JOptionPane; |
|
||||||
import java.util.Iterator; |
|
||||||
|
|
||||||
/** |
|
||||||
* 脏数据检测 |
|
||||||
* |
|
||||||
* created by Harrison on 2022/05/25 |
|
||||||
**/ |
|
||||||
public class FineDbDirtyConverter implements ThrowableConverter { |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean accept(Throwable throwable) { |
|
||||||
|
|
||||||
Throwable sign = throwable; |
|
||||||
while (sign != null) { |
|
||||||
if (sign.getClass() == GenericJDBCException.class) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
sign = sign.getCause(); |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据堆栈,确认是否是从配置中发出来的异常 |
|
||||||
* 如果是,则找到对应的配置的表, |
|
||||||
* 输出信息 |
|
||||||
* |
|
||||||
* @param throwable 异常 |
|
||||||
* @return 检测结果 |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public @Nullable DetectorResult convert(Throwable throwable) { |
|
||||||
|
|
||||||
Iterator<String> tableNames = ConfigContext.getConfigNames(); |
|
||||||
while (tableNames.hasNext()) { |
|
||||||
String tableName = tableNames.next(); |
|
||||||
Class<? extends Configuration> configClass = ConfigContext.getConfigClass(tableName); |
|
||||||
Configuration configuration = ConfigContext.getConfigInstance(configClass); |
|
||||||
try { |
|
||||||
|
|
||||||
// 尝试获取每一个值
|
|
||||||
configuration.mirror(); |
|
||||||
} catch (Throwable e) { |
|
||||||
|
|
||||||
DetectorType detectorType = DetectorType.FINE_DB_DIRTY; |
|
||||||
DetectorResult.DetectorResultBuilder builder = DetectorResult.builder() |
|
||||||
.withType(detectorType); |
|
||||||
|
|
||||||
String tipsLocale = Toolkit.i18nText(detectorType.getTipsLocale(), tableName); |
|
||||||
|
|
||||||
String solutionLocale = detectorType.getSolutionLocale(); |
|
||||||
ExceptionSolution exceptionSolution = new ExceptionSolution(new Message.Link(Toolkit.i18nText(solutionLocale, DetectorConstants.FINE_DB_HELP_LINK), DetectorConstants.FINE_DB_HELP_LINK), new SolutionAction() { |
|
||||||
@Override |
|
||||||
public String name() { |
|
||||||
return Toolkit.i18nText("Fine-Design_Basic_Reset_Immediately"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
boolean success = false; |
|
||||||
try { |
|
||||||
ResourceIOUtils.copy(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME), |
|
||||||
StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_BAK_NAME)); |
|
||||||
success = ResourceIOUtils.delete(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME)); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
// todo 最好的逻辑是,这里应该和 UI 隔离开的
|
|
||||||
if (!success) { |
|
||||||
FineJOptionPane.showMessageDialog(null, |
|
||||||
Toolkit.i18nText("Fine-Design_Error_Finedb_Backup_Reset_Result", |
|
||||||
ResourceIOUtils.getRealPath(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME))), |
|
||||||
Toolkit.i18nText("Fine-Design_Basic_Error"), |
|
||||||
JOptionPane.ERROR_MESSAGE); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
builder.withTips(tipsLocale) |
|
||||||
.withSolution(exceptionSolution) |
|
||||||
.withLog(Toolkit.i18nText(detectorType.getLogLocale(), tableName)); |
|
||||||
|
|
||||||
return builder.build(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return DetectorResult.normal(DetectorType.FINE_DB_DIRTY); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue