Groovy 处理绝地超时

Groovy 处理绝地超时,groovy,redis,timeout,jedis,Groovy,Redis,Timeout,Jedis,我有一个使用绝地API的Groovy脚本。偶尔,绝地武士的客户会超时。我知道超时默认设置为2000,可以自定义。但是我想知道是否有一种方法可以处理这个异常,以便在应用程序不崩溃的情况下优雅地处理超时错误 绝地武士的代号: use(TimerMethods) { // Connect to Redis Jedis jedis = new Jedis(redisHost, redisPort) def timer = new Timer()

我有一个使用绝地API的Groovy脚本。偶尔,绝地武士的客户会超时。我知道超时默认设置为2000,可以自定义。但是我想知道是否有一种方法可以处理这个异常,以便在应用程序不崩溃的情况下优雅地处理超时错误

绝地武士的代号:

use(TimerMethods) {
        // Connect to Redis
        Jedis jedis = new Jedis(redisHost, redisPort)

        def timer = new Timer()
        def task = timer.runEvery(1000, interval * 1000) {
            def redisHosts = jedis.lrange(key, 1, -1)
               marathonHosts.each {
            if (!redisHosts.contains(it)) {
                jedis.rpush(key, it)
                log.info("Added new host $it for $key in Redis")
            }
        }
    }
}


Exception in thread "Timer-0" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
at redis.clients.jedis.Protocol.process(Protocol.java:79)
at redis.clients.jedis.Protocol.read(Protocol.java:131)
at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:199)
at redis.clients.jedis.Connection.getMultiBulkReply(Connection.java:192)
at redis.clients.jedis.Jedis.lrange(Jedis.java:955)
at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap.invoke(PojoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
at BridgeSynchronizer.sync(Bridge.groovy:112)
at BridgeSynchronizer$sync$0.callCurrent(Unknown Source)
at BridgeSynchronizer.syncApps(Bridge.groovy:139)
at sun.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:368)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:153)
at BridgeSynchronizer$_runBridge_closure5_closure13.doCall(Bridge.groovy:163)
at BridgeSynchronizer$_runBridge_closure5_closure13.doCall(Bridge.groovy)
at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:278)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:901)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:884)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:166)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeClosure(ScriptBytecodeAdapter.java:572)
at GroovyTimerTask.run(Bridge.groovy:175)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.net.SocketInputStream.read(SocketInputStream.java:108)
at redis.clients.util.RedisInputStream.fill(RedisInputStream.java:109)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:45)
at redis.clients.jedis.Protocol.process(Protocol.java:64)
... 38 more

毫无疑问,您的一些代码将help@tim_yates更新了,谢谢你想要的是自动重新连接?您是否使用一个连接的滑阀进行检查?如果绝地失败,绝地梭将在后台生成一个新的安全绝地实例(如果可能的话),而无需检查异常(它毕竟是一个池)。