我有Map
static method(){ // also other class called this method
for (Map.Entry<String, DataSource> dataSource :dbhealth.entrySet()) {
Connection connection = dataSource.getValue().getConnection()
if (!connection.isValid(timeout)) {
print("bd connection is not valid for"+, dataSource.getKey());
}
}}
我的想法是创建新方法放入构造函数中,
public xxx(xx,xx, MeterRegistry meterRegistry){
for (Map.Entry<String, DataSource> dataSource :dbhealth.entrySet()) {
Connection connection = dataSource.getValue().getConnection()
boolean connected = connection.isValid(timeout)
if(meterRegistry!=null){
Gauge.builder(C.Metrics.DS_HEALTH, () -> (connected) ? 1 : 0)
.register(meterRegistry);
}
}
}
但这些都是重复的代码,而且看起来很连线。有什么想法或建议吗?
也许你可以尝试如下:
registerConnectionHealthMetrics
方法迭代dbhealth
地图,对于每个DataSource
,它使用Gauge
创建一个Gauge.builder
指标。 Gauge
在 MeterRegistry
中注册,值 1 表示健康连接,0 表示不健康连接。
isDataSourceConnected
方法用于检查每个数据库连接的健康状况。
在main方法中,创建
MyClass
的实例并调用registerConnectionHealthMetrics
方法来注册所有指标。
public class MyClass {
private Map<String, DataSource> dbhealth;
private MeterRegistry meterRegistry;
public MyClass(Map<String, DataSource> dbhealth, MeterRegistry meterRegistry) {
this.dbhealth = dbhealth;
this.meterRegistry = meterRegistry;
}
public void registerConnectionHealthMetrics() {
for (Map.Entry<String, DataSource> dataSourceEntry : dbhealth.entrySet()) {
DataSource dataSource = dataSourceEntry.getValue();
Gauge.builder("db_connection_health_" + dataSourceEntry.getKey(), this,
obj -> obj.isDataSourceConnected(dataSource) ? 1 : 0)
.register(meterRegistry);
}
}
private boolean isDataSourceConnected(DataSource dataSource) {
try (Connection connection = dataSource.getConnection()) {
return connection.isValid(timeout);
} catch (SQLException e) {
return false;
}
}
public static void main(String[] args) {
// Initialize your map of DataSources here
Map<String, DataSource> dbhealth = new HashMap<>();
// Populate the map with DataSource instances
// Initialize a MeterRegistry using SimpleMeterRegistry
MeterRegistry meterRegistry = new SimpleMeterRegistry();
MyClass MyClass = new MyClass(dbhealth, meterRegistry);
MyClass.registerConnectionHealthMetrics();
}
}