use of com.pamirs.pradar.pressurement.agent.event.impl.ShadowDataSourceConfigModifyEvent in project LinkAgent by shulieTech.
the class ShadowDatabaseConfigs method compareIsChangeAndSet.
@Override
public Boolean compareIsChangeAndSet(ApplicationConfig applicationConfig, Map<String, ShadowDatabaseConfig> newValue) {
Set<ShadowDatabaseConfig> needCloseDataSource = new HashSet<ShadowDatabaseConfig>();
// 同名配置比对
for (Map.Entry<String, ShadowDatabaseConfig> old : GlobalConfig.getInstance().getShadowDatasourceConfigs().entrySet()) {
String key = old.getKey();
ShadowDatabaseConfig newConfig = newValue.get(key);
if (null == newConfig) {
// 删除的配置
needCloseDataSource.add(old.getValue());
if (logger.isInfoEnabled()) {
logger.info("deleted config:" + key);
}
// 不需要再比对
continue;
}
// 判断是否变更
if (!newConfig.equals(old.getValue())) {
// 修改的配置
needCloseDataSource.add(old.getValue());
if (logger.isInfoEnabled()) {
logger.info("modified config:" + key);
}
}
}
for (Map.Entry<String, ShadowDatabaseConfig> entry : newValue.entrySet()) {
// 判断是否是新增内容
if (null == GlobalConfig.getInstance().getShadowDatabaseConfig(entry.getKey())) {
// 新增的配置
needCloseDataSource.add(entry.getValue());
if (logger.isInfoEnabled()) {
logger.info("added config:" + entry.getKey());
}
}
}
if (needCloseDataSource.isEmpty() && newValue.size() == GlobalConfig.getInstance().getShadowDatasourceConfigs().size()) {
return Boolean.FALSE;
}
GlobalConfig.getInstance().setShadowDatabaseConfigs(newValue, true);
applicationConfig.setShadowDatabaseConfigs(GlobalConfig.getInstance().getShadowDatasourceConfigs());
ShadowDataSourceConfigModifyEvent shadowDataSourceConfigModifyEvent = new ShadowDataSourceConfigModifyEvent(needCloseDataSource);
EventRouter.router().publish(shadowDataSourceConfigModifyEvent);
// 清除影子表模式的sql表名替换缓存
SqlParser.clear();
PradarSwitcher.turnConfigSwitcherOn(ConfigNames.SHADOW_DATABASE_CONFIGS);
if (logger.isInfoEnabled()) {
logger.info("publish datasource config successful. new config: {}", newValue);
for (Map.Entry<String, ShadowDatabaseConfig> entry : newValue.entrySet()) {
logger.info(entry.getKey());
logger.info(entry.getValue().toString());
}
}
return Boolean.TRUE;
}
use of com.pamirs.pradar.pressurement.agent.event.impl.ShadowDataSourceConfigModifyEvent in project LinkAgent by shulieTech.
the class DataSourceGetConnectionCutoffInterceptor method addListener.
private void addListener() {
EventRouter.router().addListener(new PradarEventListener() {
@Override
public EventResult onEvent(IEvent event) {
if (!(event instanceof ClusterTestSwitchOffEvent)) {
return EventResult.IGNORE;
}
// 关闭压测数据源
AtomikosDataSourceBeanWrapUtil.destroy();
AtomikosNonXADataSourceBeanWrapUtil.destroy();
return EventResult.success("tomcat-jdbc-plugin");
}
@Override
public int order() {
return 8;
}
}).addListener(new PradarEventListener() {
@Override
public EventResult onEvent(IEvent event) {
if (!(event instanceof ShadowDataSourceConfigModifyEvent)) {
return EventResult.IGNORE;
}
ShadowDataSourceConfigModifyEvent shadowDataSourceConfigModifyEvent = (ShadowDataSourceConfigModifyEvent) event;
Set<ShadowDatabaseConfig> target = shadowDataSourceConfigModifyEvent.getTarget();
if (null == target || target.size() == 0) {
return EventResult.IGNORE;
}
for (ShadowDatabaseConfig config : target) {
Iterator<Map.Entry<DataSourceMeta, AtomikosDataSourceBeanMediaDataSource>> it = AtomikosDataSourceBeanWrapUtil.pressureDataSources.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<DataSourceMeta, AtomikosDataSourceBeanMediaDataSource> entry = it.next();
if (StringUtils.equalsIgnoreCase(DbUrlUtils.getKey(config.getUrl(), config.getUsername()), DbUrlUtils.getKey(entry.getKey().getUrl(), entry.getKey().getUsername()))) {
AtomikosDataSourceBeanMediaDataSource value = entry.getValue();
it.remove();
try {
value.close();
if (logger.isInfoEnabled()) {
logger.info("module-atomikos-datasource: destroyed shadow table datasource success. url:{} ,username:{}", entry.getKey().getUrl(), entry.getKey().getUsername());
}
} catch (Throwable e) {
logger.error("module-atomikos-datasource: closed datasource err! target:{}, url:{} username:{}", entry.getKey().getDataSource().hashCode(), entry.getKey().getUrl(), entry.getKey().getUsername(), e);
}
break;
}
}
Iterator<Map.Entry<DataSourceMeta, AtomikosNonXADataSourceBeanMediaDataSource>> nonIt = AtomikosNonXADataSourceBeanWrapUtil.pressureDataSources.entrySet().iterator();
while (nonIt.hasNext()) {
Map.Entry<DataSourceMeta, AtomikosNonXADataSourceBeanMediaDataSource> entry = nonIt.next();
if (StringUtils.equalsIgnoreCase(config.getUrl(), entry.getKey().getUrl()) && StringUtils.equalsIgnoreCase(config.getUsername(), entry.getKey().getUsername())) {
AtomikosNonXADataSourceBeanMediaDataSource value = entry.getValue();
nonIt.remove();
try {
value.close();
if (logger.isInfoEnabled()) {
logger.info("module-atomikos-datasource: destroyed shadow table datasource success. url:{} ,username:{}", entry.getKey().getUrl(), entry.getKey().getUsername());
}
} catch (Throwable e) {
logger.error("module-atomikos-datasource: closed datasource err! target:{}, url:{} username:{}", entry.getKey().getDataSource().hashCode(), entry.getKey().getUrl(), entry.getKey().getUsername(), e);
}
break;
}
}
}
return EventResult.success("module-atomikos-datasource: destroyed shadow table datasource success.");
}
@Override
public int order() {
return 2;
}
});
}
Aggregations