簡體   English   中英

如何使用 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。 根據該版本 mongo 的文檔“默認情況下禁用 JMX 連接池監視。要啟用它,請通過 MongoClientOptions 添加 com.mongodb.management.JMXConnectionPoolListener 實例”

但是,在 spring-data-mongo 的 xml 模式中,clientOptionsType 不允許設置該值,除非我遺漏了什么。 有沒有什么辦法,用spring-data-mongodb,通過xml開啟連接池監控?

這是我的 mongo bean xml

<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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM