Соединение Spring-Redis без повторного подключения между повторными попытками

#java #spring #spring-boot #redis

Вопрос:

Я работаю над приложением Spring-Batch, которое использует соединение REDIS для заполнения данных.

Вот некоторые соответствующие зависимости:

 implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.lettuce:lettuce-core:5.3.3.RELEASE'
 

Повторное подключение импортируется из org.springframework.data.redis.connection

ПОСТАНОВКА ПРОБЛЕМЫ: Может быть случай, когда RedisConnection активен при запуске приложения, но во время работы приложения мы можем потерять соединение Redis. В этом случае, когда он вводит метод ниже, метод выдаст ошибку о том, что соединение Redis потеряно. Следовательно, мы повторяем попытку, используя логику @Retryable. Но, допустим, во время второй попытки соединение Redis будет восстановлено, мы хотим, чтобы повторная попытка смогла это обнаружить, повторно подключиться к redis и перейти к нормальному потоку. Но «ПОВТОРНОЕ ПОДКЛЮЧЕНИЕ НЕ ОБНАРУЖИВАЕТСЯ»

ПРОБОВАЛ: Я пытался следовать https://github.com/lettuce-io/lettuce-core/issues/338 и добавлено lettuceConnectionFactory.validateConnection(); в defaultRedisConnection, как показано ниже, но безрезультатно

     @Qualifier("defaultRedisConnection")
    @Bean
    public RedisConnection defaultRedisConnectionDockerCluster() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName("redis");

        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        lettuceConnectionFactory.validateConnection();
        lettuceConnectionFactory.afterPropertiesSet();
        return lettuceConnectionFactory.getConnection();
    }
 

Вот такой класс:

 @Slf4j
@Service
public class PopulateRedisDataService {

    @Qualifier("defaultRedisConnection")
    private final RedisConnection redisConnection;

    private RedisClientData redisClientData = new RedisClientData();

    public PopulateRedisDataService(
            @Qualifier("defaultRedisConnection") RedisConnection redisConnection,
            RedisDataUtils redisDataUtils) {
        this.redisConnection = redisConnection;
    }

    @Retryable(maxAttemptsExpression = "3", backoff = @Backoff(delayExpression = "20_000",
            multiplierExpression = "100_000", maxDelayExpression = "100_000"))
    public RedisClientData populateData() {
         try {
            byte[] serObj = Objects.requireNonNull(redisConnection.get("SOME_KEY".getBytes()));
            RedisClientData redisClientData = new RedisClientData();
            // Some operations to load data from Redis/serObj into redisClientData object.
        } catch (Exception e) {
             // If Redis doesn't have the key, return empty redisClientData
            redisClientData = new RedisClientData();
            log.error("Failed to get ClientRegList", e);
        }
         return redisClientData;
    }

    @Recover
    public void recover(Exception e) {
        // Some operations
    }
}
 

Любые предложения по решению этого дела будут высоко оценены.