Lettuce連接池——解決“MXBean already registered with name org.apache.commons.pool2:type=GenericObjectPool,name=pool”


LettuceConfig:
package com.youdao.outfox.interflow.config;

import io.lettuce.core.support.ConnectionPoolSupport;
import io.lettuce.core.RedisURI;
import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;


@Configuration
@ConfigurationProperties(prefix = "redis")
public class LettuceConfig {
    private List<String> nodes;

    public List<String> getNodes() {
        return nodes;
    }

    public void setNodes(List<String> nodes) {
        this.nodes = nodes;
    }

    @Bean
    public RedisClusterClient redisClient() {
        List<RedisURI> uriList = new ArrayList<>();
        nodes.forEach(node -> {
            String[] addrStr = node.split(":");
            String host = addrStr[0];
            int port = Integer.parseInt(addrStr[1]);

            RedisURI redisUri = RedisURI.Builder.redis(host).withPort(port).build();
            uriList.add(redisUri);
        });
        RedisClusterClient redisClient = RedisClusterClient.create(uriList);
        return redisClient;
    }

    @Bean
    public GenericObjectPoolConfig genericObjectPoolConfig() {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setJmxEnabled(false);
        return genericObjectPoolConfig;
    }

    @Bean(name = "redisConnectionPool")
    public GenericObjectPool<StatefulRedisClusterConnection<String, String>> redisConnectionPool(
            RedisClusterClient redisClient, GenericObjectPoolConfig genericObjectPoolConfig) {
        GenericObjectPool<StatefulRedisClusterConnection<String, String>> redisPool = ConnectionPoolSupport.
                createGenericObjectPool(() -> redisClient.connect(), genericObjectPoolConfig);
        return redisPool;
    }

}

這里的bean GenericObjectPoolConfig中有一個genericObjectPoolConfig.setJmxEnabled(false); 關掉監控 這個異常就不會拋出了~

還有要注意 在每次使用完連接之后 要調用close()或者使用try(){}的方式,會自動調用close(),很優雅~

eg:

    @Override
    public <T> T get(String key, Class<T> clazz) {
        try (StatefulRedisClusterConnection connect = redisPool.borrowObject()){
            RedisAdvancedClusterCommands<String, String> redisCommands = connect.sync();
            String value = redisCommands.get(key);
            return JSONObject.parseObject(value, clazz);
        } catch (Exception e) {
            logger.warn("Redis get() failed! key=" + key, e);
            return null;
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM