2017-12-11 5 views
0

매 5 분마다 배치 작업을 실행하고 있으므로 다른 노드에서 동일한 작업을 실행하지 않으므로 Jedis 잠금을 사용하여 5 분 동안 오브젝트를 잠글 수 있습니다. 그래서 다른 노드가 동일한 작업을 실행하려고하면 잠금을 얻지 못합니다. 작업은 잠금을 획득 한 후 시작 나는 레디 스에서 내가 코드를 내가Jedis 연결을 가져올 수 없습니다. 풀에서 리소스를 가져올 수 없습니다.

@Bean 
public Jedis getJedis() 
{ 
    Jedis jedis = new Jedis(this.redisHost, nteger.valueOf(this.redisPort)); 
    jedis.auth(this.redisPassword); 
    return jedis; 
} 

봄 부팅 Application.properties 파일이 어떤 이것은

'Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 
    at redis.clients.util.Pool.getResource(Pool.java:53) 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16) 
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:194) 
    ... 40 more 
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 
    at redis.clients.jedis.Connection.disconnect(Connection.java:224) 
    at redis.clients.jedis.BinaryClient.disconnect(BinaryClient.java:941) 
    at redis.clients.jedis.Connection.close(Connection.java:214) 
    at redis.clients.jedis.BinaryClient.close(BinaryClient.java:947) 
    at redis.clients.jedis.Jedis.close(Jedis.java:3412) 
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:117) 
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:434) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) 
    at redis.clients.util.Pool.getResource(Pool.java:49)' 

말을 다음과 같은 예외를 얻고 그것을 읽으려고 할 때

# DATA REDIS 
spring.data.redis.repositories.enabled=true 
# REDIS (RedisProperties) 
spring.redis.host=10.160.49.22 
spring.redis.password=qweqewqw 
spring.redis.ssl=true 
#spring.redis.pool.max-active=10 
#spring.redis.pool.max-idle=10 
# spring.redis.pool.max-wait=30000 
spring.redis.port=6379 

작업 잠금

을 얻기 위해 시작에서 다음 코드를 실행 그 레디 스 저장소 클래스 후

List<String> hotelCodes = redisTemplate.execute(new RedisCallback<List<String>>() { 
      /** 
      * Gets called by {@link RedisTemplate} with an active Redis connection. Does not need to care about activating or 
      * closing the connection or handling exceptions. 
      * 
      * @param connection active Redis connection 
      * @return a result object or {@code null} if none 
      * @throws DataAccessException 
      */ 
      @Override 
      public List<String> doInRedis(RedisConnection connection) throws DataAccessException { 
       ScanOptions options = ScanOptions.scanOptions().match(pattern).count(1).build(); 
       Cursor<Map.Entry<byte[], byte[]>> entries = connection.hScan(HASH_KEY.getBytes(), options); 
       List<String> result = new ArrayList<>(); 
       if (entries != null) 
        while (entries.hasNext()) { 
         Map.Entry<byte[], byte[]> entry = entries.next(); 
         byte[] actualValue = entry.getValue(); 
         result.add(new String(actualValue)); 
        } 

       return result; 
      } 
     }); 
     return hotelCodes; 

다음이 내가 로그에서 볼 수있는 완전한 예외는 .. 특정 패턴의 값을 읽으려고합니다.

org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:204) 
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:348) 
    at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129) 
    at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:92) 
    at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:79) 
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:194) 
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169) 
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:157) 
    at com.hyatt.pms.jobs.dao.impl.HeartbeatRepositoryImpl.findAll(HeartbeatRepositoryImpl.java:62) 
    at com.hyatt.pms.jobs.dao.impl.HeartbeatRepositoryImpl$$FastClassBySpringCGLIB$$e3fe6169.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) 
    at com.hyatt.pms.jobs.dao.impl.HeartbeatRepositoryImpl$$EnhancerBySpringCGLIB$$68719252.findAll(<generated>) 
    at com.hyatt.pms.jobs.processors.HeartbeatTestProcessor.processCluster(HeartbeatTestProcessor.java:54) 
    at com.hyatt.pms.jobs.processors.TestProcessor.process(TestProcessor.java:61) 
    at com.hyatt.pms.jobs.processors.HeartbeatTestProcessor.process(HeartbeatTestProcessor.java:39) 
    at com.hyatt.pms.jobs.processors.HeartbeatTestProcessor$$FastClassBySpringCGLIB$$99fdfbdc.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669) 
    at com.hyatt.pms.jobs.processors.HeartbeatTestProcessor$$EnhancerBySpringCGLIB$$860eb7e4.process(<generated>) 
    at com.hyatt.pms.jobs.domain.jobs.HeartbeatJob.runHealthCheck(HeartbeatJob.java:34) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) 
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) 
    at java.util.concurrent.Executors$RunnableAdapter.call$$$capture(Executors.java:511) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java) 
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) 
    at java.util.concurrent.FutureTask.run(FutureTask.java) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 
    at redis.clients.util.Pool.getResource(Pool.java:53) 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16) 
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:194) 
    ... 40 more 
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 
    at redis.clients.jedis.Connection.disconnect(Connection.java:224) 
    at redis.clients.jedis.BinaryClient.disconnect(BinaryClient.java:941) 
    at redis.clients.jedis.Connection.close(Connection.java:214) 
    at redis.clients.jedis.BinaryClient.close(BinaryClient.java:947) 
    at redis.clients.jedis.Jedis.close(Jedis.java:3412) 
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:117) 
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:434) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) 
    at redis.clients.util.Pool.getResource(Pool.java:49) 
    ... 43 more 
Caused by: java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
    at java.net.SocketInputStream.read(SocketInputStream.java:171) 
    at java.net.SocketInputStream.read(SocketInputStream.java:141) 
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) 
    at sun.security.ssl.InputRecord.read(InputRecord.java:503) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) 
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:757) 
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) 
    at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:52) 
    at redis.clients.util.RedisOutputStream.flush(RedisOutputStream.java:216) 
    at redis.clients.jedis.Connection.disconnect(Connection.java:220) 
    ... 52 more 

누구나이 예외가 발생하는 이유와 해결 방법을 알고 계십니까?

+0

가능한 중복 아래와 같이 설정과

2.Otherwise 사용 봄의 redisTemplate [지정해 SocketTimeoutException : 시간을 읽기] (https://stackoverflow.com/questions/26764252/sockettimeoutexception-read-time-out) – mp911de

+0

아니요, 사용하는 libs 때문에 내 문제가 다릅니다. – ramkris

답변

0

1.Try은에서 Jedis을 JedisPool 콩을 사용하고 가야, 그것을 위해 당신이 콩으로 사용하고 있기 때문에 설정 에 JedisPool을 구성해야합니다, 대신 new Jedis()를 사용 Jedis에게 인스턴스를 얻을 수 Jedis에게 연결 풀을 사용하는 어디서나 작업을 수행하고 작업을 마친 후 닫아야합니다. 의

@Bean 
public JedisConnectionFactory redisConnectionFactory() { 
    JedisConnectionFactory factory = new JedisConnectionFactory(); 
    factory.setHostName(redisHostName); 
    factory.setPort(redisPort); 
    factory.setUsePool(true); 

    return factory; 
} 

@Bean 
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory cf) { 
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>(); 
    redisTemplate.setDefaultSerializer(new StringRedisSerializer()); 
    redisTemplate.setConnectionFactory(cf); 

    return redisTemplate; 
} 
관련 문제