java SpringRedis连接在重试之间未重新连接
我正在开发一个Spring批处理应用程序,它使用REDIS连接来填充数据
以下是一些相关的依赖关系:
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.lettuce:lettuce-core:5.3.3.RELEASE'
重新连接是从org.springframework.data.redis.connection
导入的
问题陈述: 当我们启动应用程序时,可能会出现Redis连接处于活动状态的情况,但在应用程序运行期间,我们可能会失去Redis连接。在这种情况下,当它输入下面的方法时,该方法将抛出一个错误,即Redis连接丢失。因此,我们使用@Retryable逻辑重试。 但是,假设在第二次重试期间,Redis连接被重新建立,我们希望重试能够检测到这一点,并重新连接到Redis,进入正常的流。但是,“没有检测到REDIS-RECONNECTION”
尝试了:我尝试了跟随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
}
}
任何处理此案的建议都将不胜感激
共 (0) 个答案