如何在 XML 中使用 spring-data-mongodb 启用 mongo 连接池监控?
How to enable mongo connection pool monitoring with spring-data-mongodb in XML?
我正在使用 spring-data-mongodb 1.10.12 和 mongo 3.6.4。我最近从mongo的低版本升级而来,现在我的mongo连接池监控坏了,因为没有注册ConnectionPoolStatisticsMBean。根据 documentation 那个版本 mongo "JMX connection pool monitoring is disabled by default. To enable it add a com.mongodb.management.JMXConnectionPoolListener instance via MongoClientOptions"
但是,在 spring-data-mongo 的 xml 架构中,clientOptionsType 不允许设置该值,除非我遗漏了什么。有没有办法,用spring-data-mongodb,通过xml开启连接池监控?
这是我的 xml mongo 个豆子
<mongo:mongo-client id="mongo"
host="${mongo.hostname:#{null}}"
replica-set="${mongo.replica.set:#{null}}"
port="${mongo.port}"
credentials="'${mongo.username}:${mongo.password}@${mongo.auth.db.name}?uri.authMechanism=${mongo.auth.mechanism:SCRAM-SHA-1}'"
>
<mongo:client-options connections-per-host="${mongo.connections-per-host:40}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threads-blocked-per-connection:3}"
connect-timeout="${mongo.connection-timeout:10000}"
max-wait-time="${mongo.maxWaitTime:120000}"
socket-keep-alive="${mongo.socketKeepAlive:true}"
socket-timeout="${mongo.socketTimeout:0}"
read-preference="${mongo.read.preference:PRIMARY_PREFERRED}"
write-concern="${mongo.write.concern:ACKNOWLEDGED}"
/>
</mongo:mongo-client>
和我的 pom 依赖项
<properties>
<mongo-version>3.6.4</mongo-version>
<spring-data-version>1.10.12.RELEASE</spring-data-version>
</properties>
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>${mongo-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring-data-version}</version>
</dependency>
</dependencies>
确实没有办法通过 spring-data-mongodb 模式添加连接池监听器,但是维护 repo 的人提出了一个解决方案是使用 BeanPostProcessor 在将 MongoClientOptions 传递给 mongo 客户端之前更改它们
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof MongoClientOptions) {
return MongoClientOptions.builder((MongoClientOptions) bean)
.addConnectionPoolListener(new JMXConnectionPoolListener()).build();
}
return bean;
}
这样做成功地为我注册了 ConnectionPoolStatisticsMBeans
我遇到了同样的挑战。就我而言,最初 Spring 配置是使用 XML 完成的。我已经设法将 XML 配置与 Java 配置相结合,因为 Java 配置 让您更灵活地配置 MongoClientOptions
:
@Configuration
public class MongoClientWrapper {
@Bean
public MongoClient mongo()
{
//credentials:
MongoCredential credential = MongoCredential.createCredential("user", "auth-db", "password".toCharArray());
MongoClientOptions options = MongoClientOptions.builder()
.addConnectionPoolListener(new MyConnectionPoolListener())
.build();
return new MongoClient(
new ServerAddress("localhost", 27017), //replica-set
Arrays.asList(credential)
,options
);
}
@Bean
public MongoTemplate mongoTemplate()
{
return new MongoTemplate(mongo(), database);
}
...
}
希望这对某人有所帮助...
在我的项目中,添加BeanPostProcessor 没有用,因为MongoClientOptions Bean 没有自动实例化。
我必须手动创建 Bean 才能在我的环境中添加连接池侦听器:
@Bean public MongoClientOptions myMongoClientOptions() {
return MongoClientOptions.builder().addConnectionPoolListener(new JMXConnectionPoolListener()).build();
}
我正在使用 spring-data-mongodb 1.10.12 和 mongo 3.6.4。我最近从mongo的低版本升级而来,现在我的mongo连接池监控坏了,因为没有注册ConnectionPoolStatisticsMBean。根据 documentation 那个版本 mongo "JMX connection pool monitoring is disabled by default. To enable it add a com.mongodb.management.JMXConnectionPoolListener instance via MongoClientOptions"
但是,在 spring-data-mongo 的 xml 架构中,clientOptionsType 不允许设置该值,除非我遗漏了什么。有没有办法,用spring-data-mongodb,通过xml开启连接池监控?
这是我的 xml mongo 个豆子
<mongo:mongo-client id="mongo"
host="${mongo.hostname:#{null}}"
replica-set="${mongo.replica.set:#{null}}"
port="${mongo.port}"
credentials="'${mongo.username}:${mongo.password}@${mongo.auth.db.name}?uri.authMechanism=${mongo.auth.mechanism:SCRAM-SHA-1}'"
>
<mongo:client-options connections-per-host="${mongo.connections-per-host:40}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threads-blocked-per-connection:3}"
connect-timeout="${mongo.connection-timeout:10000}"
max-wait-time="${mongo.maxWaitTime:120000}"
socket-keep-alive="${mongo.socketKeepAlive:true}"
socket-timeout="${mongo.socketTimeout:0}"
read-preference="${mongo.read.preference:PRIMARY_PREFERRED}"
write-concern="${mongo.write.concern:ACKNOWLEDGED}"
/>
</mongo:mongo-client>
和我的 pom 依赖项
<properties>
<mongo-version>3.6.4</mongo-version>
<spring-data-version>1.10.12.RELEASE</spring-data-version>
</properties>
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>${mongo-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring-data-version}</version>
</dependency>
</dependencies>
确实没有办法通过 spring-data-mongodb 模式添加连接池监听器,但是维护 repo 的人提出了一个解决方案是使用 BeanPostProcessor 在将 MongoClientOptions 传递给 mongo 客户端之前更改它们
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof MongoClientOptions) {
return MongoClientOptions.builder((MongoClientOptions) bean)
.addConnectionPoolListener(new JMXConnectionPoolListener()).build();
}
return bean;
}
这样做成功地为我注册了 ConnectionPoolStatisticsMBeans
我遇到了同样的挑战。就我而言,最初 Spring 配置是使用 XML 完成的。我已经设法将 XML 配置与 Java 配置相结合,因为 Java 配置 让您更灵活地配置 MongoClientOptions
:
@Configuration
public class MongoClientWrapper {
@Bean
public MongoClient mongo()
{
//credentials:
MongoCredential credential = MongoCredential.createCredential("user", "auth-db", "password".toCharArray());
MongoClientOptions options = MongoClientOptions.builder()
.addConnectionPoolListener(new MyConnectionPoolListener())
.build();
return new MongoClient(
new ServerAddress("localhost", 27017), //replica-set
Arrays.asList(credential)
,options
);
}
@Bean
public MongoTemplate mongoTemplate()
{
return new MongoTemplate(mongo(), database);
}
...
}
希望这对某人有所帮助...
在我的项目中,添加BeanPostProcessor 没有用,因为MongoClientOptions Bean 没有自动实例化。 我必须手动创建 Bean 才能在我的环境中添加连接池侦听器:
@Bean public MongoClientOptions myMongoClientOptions() {
return MongoClientOptions.builder().addConnectionPoolListener(new JMXConnectionPoolListener()).build();
}