jedis bean 등록 이후 connection pool 설정을 하려했을때 발생한 문제
문제가된 코드
문제가된 Bean : @Bean(“myJedisPool”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@Slf4j
@Configuration
public class MyRedisConfig {
@Value("${data.redis.host}")
private String HOST;
@Value("${data.redis.port}")
private int PORT;
@Value("${data.redis.maxTotal}")
private int MAX_TOTAL;
@Value("${data.redis.maxIdle}")
private int MAX_IDLE;
@Value("${data.redis.minIdle}")
private int MIN_IDLE;
@Value("${data.redis.maxWaitMillis}")
private long MAX_WAIT_MILLIS;
@Bean("myJedisPool")
public JedisPool myJedisPool() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(MAX_TOTAL);
poolConfig.setMaxIdle(MAX_IDLE);
poolConfig.setMinIdle(MIN_IDLE);
poolConfig.setMaxWaitMillis(MAX_WAIT_MILLIS);
try {
return new JedisPool(poolConfig, HOST, PORT);
} catch (Exception e) {
log.error("Error initializing Jedis pool", e);
return null;
}
}
@Bean
public Jedis jedis(@Qualifier("myJedisPool") JedisPool jedisPool) {
try (
Jedis jedis = jedisPool.getResource();
) {
return jedis;
} catch (JedisException jedisException) {
log.error("jedis bean registration fail", jedisException);
return null;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
Caused by: javax.management.InstanceAlreadyExistsException: MXBean already registered with name org.apache.commons.pool2:type=GenericObjectPool,name=pool
at java.management/com.sun.jmx.mbeanserver.MXBeanLookup.addReference(MXBeanLookup.java:152) ~[na:na]
at java.management/com.sun.jmx.mbeanserver.MXBeanSupport.register(MXBeanSupport.java:160) ~[na:na]
at java.management/com.sun.jmx.mbeanserver.MBeanSupport.preRegister2(MBeanSupport.java:173) ~[na:na]
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:924) ~[na:na]
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:895) ~[na:na]
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:320) ~[na:na]
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:523) ~[na:na]
at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:138) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:687) ~[spring-context-6.1.3.jar:6.1.3]
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:631) ~[spring-context-6.1.3.jar:6.1.3]
... 14 common frames omitted
어떤 이유인지는 몰라도 해당 부분에서 MXbean에 이미 등록되었다고 나옴 실제로 디버깅을 해보니 multiname이 null 로 들어가 발생
해결 방법 : 여러 사이트를 돌아다니면서 테스트를 해보았으나
결국, JMX를 이용한 JedisPool 모니터링을 포기하고 해당 코드 추가 : poolConfig.setJmxEnabled(false);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Bean("myJedisPool")
public JedisPool myJedisPool() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setJmxEnabled(false);
poolConfig.setMaxTotal(MAX_TOTAL);
poolConfig.setMaxIdle(MAX_IDLE);
poolConfig.setMinIdle(MIN_IDLE);
poolConfig.setMaxWaitMillis(MAX_WAIT_MILLIS);
try {
return new JedisPool(poolConfig, HOST, PORT);
} catch (Exception e) {
log.error("Error initializing Jedis pool", e);
return null;
}
}
실행 확인