diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index 7a4949f07..024920701 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -1080,18 +1080,19 @@ public class CommandAsyncService implements CommandAsyncExecutor { return; } - if (future.cause() instanceof RedisTryAgainException - || future.cause() instanceof RedisLoadingException) { - connectionManager.newTimeout(new TimerTask() { - @Override - public void run(Timeout timeout) throws Exception { - async(details.isReadOnlyMode(), source, details.getCodec(), - details.getCommand(), details.getParams(), details.getMainPromise(), details.getAttempt(), ignoreRedirect); - - } - }, 1, TimeUnit.SECONDS); - AsyncDetails.release(details); - return; + if (future.cause() instanceof RedisLoadingException + || future.cause() instanceof RedisTryAgainException) { + if (details.getAttempt() < connectionManager.getConfig().getRetryAttempts()) { + connectionManager.newTimeout(new TimerTask() { + @Override + public void run(Timeout timeout) throws Exception { + async(details.isReadOnlyMode(), source, details.getCodec(), + details.getCommand(), details.getParams(), details.getMainPromise(), details.getAttempt() + 1, ignoreRedirect); + } + }, Math.min(connectionManager.getConfig().getTimeout(), 1000), TimeUnit.MILLISECONDS); + AsyncDetails.release(details); + return; + } } free(details.getParams()); diff --git a/redisson/src/main/java/org/redisson/command/CommandBatchService.java b/redisson/src/main/java/org/redisson/command/CommandBatchService.java index 5a505d238..6d020a912 100644 --- a/redisson/src/main/java/org/redisson/command/CommandBatchService.java +++ b/redisson/src/main/java/org/redisson/command/CommandBatchService.java @@ -776,16 +776,18 @@ public class CommandBatchService extends CommandAsyncService { execute(entry, nodeSource, mainPromise, slots, attempt, options); return; } - if (future.cause() instanceof RedisTryAgainException - || future.cause() instanceof RedisLoadingException) { - entry.clearErrors(); - connectionManager.newTimeout(new TimerTask() { - @Override - public void run(Timeout timeout) throws Exception { - execute(entry, source, mainPromise, slots, attempt, options); - } - }, 1, TimeUnit.SECONDS); - return; + if (future.cause() instanceof RedisLoadingException + || future.cause() instanceof RedisTryAgainException) { + if (details.getAttempt() < connectionManager.getConfig().getRetryAttempts()) { + entry.clearErrors(); + connectionManager.newTimeout(new TimerTask() { + @Override + public void run(Timeout timeout) throws Exception { + execute(entry, source, mainPromise, slots, attempt + 1, options); + } + }, Math.min(connectionManager.getConfig().getTimeout(), 1000), TimeUnit.MILLISECONDS); + return; + } } free(entry);