#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
}
}
Любые предложения по решению этого дела будут высоко оценены.