Project 2. 아이돌 티켓팅 접속자 대기열 시스템 Ch 02. Redis 15. Cache 실습시 UnableToRegisterMBeanException

db, java

제목의 과정에 해당하는 소스 구동시 다음과 같은 오류가 발생한다.

2025-01-24T17:43:05.983+09:00 ERROR 7916 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed

org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [JedisPool [maxTotal=8, blockWhenExhausted=true, maxWaitDuration=PT-0.001S, lifo=true, fairness=false, testOnCreate=false, testOnBorrow=false, testOnReturn=false, testWhileIdle=false, durationBetweenEvictionRuns=PT-0.001S, numTestsPerEvictionRun=3, minEvictableIdleTimeDuration=PT30M, softMinEvictableIdleTimeDuration=PT-0.001S, evictionPolicy=org.apache.commons.pool2.impl.DefaultEvictionPolicy@6199579c, closeLock=java.lang.Object@28936391, closed=false, evictionLock=java.lang.Object@9eb18ad, evictor=null, evictionIterator=null, factoryClassLoader=java.lang.ref.WeakReference@16bcf72e, oname=org.apache.commons.pool2:type=GenericObjectPool,name=pool, creationStackTrace=java.lang.Exception
at org.apache.commons.pool2.impl.BaseGenericObjectPool.<init>(BaseGenericObjectPool.java:407)
at org.apache.commons.pool2.impl.GenericObjectPool.<init>(GenericObjectPool.java:147)
at redis.clients.jedis.util.Pool.<init>(Pool.java:16)

강의에서는 redis port번호를 변경 후 정상접속이 되던데 git에서 받은 소스는 포트번호가 정확해서 해당 이유도 아닐 것 같은데 안됨.

RedisConfig를 다음과 같이 수정하여 해결. 메세지만 봤을때는 JMX의 빈 명칭이 충돌하는 것이 원인인 것 같은데 아래와 같은 설정으로 jmx모니터링만 포기하면 진행 가능하다.

package com.example.jediscache;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Component
public class RedisConfig {

    @Bean
    public JedisPool createJedisPool() {
//        return new JedisPool("localhost", 6379);
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setJmxEnabled(false); // JMX 등록 비활성화
        return new JedisPool(poolConfig, "127.0.0.1", 6379);
    }
}

좀 더 사유를 찾아보니 Spring은 애플리케이션 실행 시 Bean으로 등록된 객체를 자동으로 MBean으로 등록하는데 Spring 초기화 시 JedisPool을 MBean으로 등록한 상태에서 JedisPool 객체가 연결(pool)을 생성하고 반환하면서 동일한 JedisPool 객체를 다시 MBean으로 등록하려고 시도하면서 중복된 MBean 이름으로 인해 오류가 발생하는 거라고 함.

생계형 특급 개발자이자 아들 하나 있는 평범한 아빠. 취미는 요리, 캠핑, 뮤직 페스티발 다니기 등이지만 이 블로그에는 주로 개발관련된 내용만 올릴 예정입니다. 워드프레스를 시작한지 얼마 되지않아 사이트가 허전하지만 좋은 내용으로 채우도록 노력하겠습니다. 자주 놀러오세요 ^^
Posts created 56

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top