有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案