如何使用带有vertx的java重新连接到redis?

如果服务器出现故障,我正在处理的应用程序不会重新连接到 redis 服务器.

当我的应用程序启动并且redis服务器仍未运行时,我的应用程序尝试重新连接直到服务器运行并且它们连接。但是当两者连接并且 redis 服务器出现故障时,我的应用程序不会尝试重新连接并开始出错 [ http状态:500 消息:“Redis 连接已断开。” ]

我创建了一个向 redis 发出请求的端点作为测试,我在我的机器上运行服务器,这是我正在使用的测试环境。

我尝试使用 io.vertx.redis.client 包中的 RedisOptions 配置连接但没有成功。你能帮帮我吗?

代码:

private     final RedesOptions options =     new RedesOptions()
    private Redis redisClient;
         

    private void createRedisClient(Handler<AsyncResult<Redis>> handler){
                Redis.createClient(vertx, options)
                        .connect(onConnect -> {
                                if (onConnect.succeeded()) {
                                    this.redisClient = onConnect.result();
                                //make sure the client is reconnected o error
                                    this.redisClient.exceptionHandler(e -> {
                                    // attempt to reconnect
                                    attemptReconnect(0);
                                });
                            }
                            // allow further processing
                            handler.handle(onConnect);
                        });
            }


      private void attemptReconnect(int retry){
        if (retry > MAX_RECONNECT_RETRIES) {
        // we should stop now, as there's nothing we can do.
    }     else {
        System.out.println("erro de conexao >>>> " );
        // retry with backoff up to 10240 ms
        long backoff = (long) (Math.pow(2, Math.min(retry, 10)) * 10);

        vertx.setTimer(backoff, timer -> createRedisClient(onReconnect -> {
                if (onReconnect.failed()) {
                attemptReconnect(retry + 1);
            }
        }));
    }
}

并在类的构造函数中调用这个方法createRedisClient。

代码:

createRedisClient(onCreate -> {
            if (onCreate.succeeded()) {
                System.out.println("conectado com sucesso >>> " + onCreate.result());
                log.info("Redis Connected: "+onCreate.result());
        }     else     if (onCreate.failed()) {
                System.out.println("erro de conexao >>>> " + onCreate.result());
                attemptReconnect(0);
        }
    });
java
database
redis
2023-04-19 14:10:46
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
ycy856

我最近遇到了同样的问题。而且我相信您正在像我一样从顶点文档中粘贴官方建议的重新连接代码:

我可以验证你的情况,我在 ​​vertx-redis-client #issue 375​​ 与复制者一起打开了一个问题

当我找到解决方案时,维护人员还没有回复我 - 使用

endHandler

而不是

exceptionHandler

像:

//make sure the client is reconnected o error    this.redisClient.endHandler(e -> {
    // attempt to reconnect
    attemptReconnect(0);
});

当redis服务器出现网络问题或者redis服务器暂时做的很短的时候,这个非常有效。

endHandler

RedicConnectionManager

中调用:

netSocket
        .handler(new RESPParser(connection, options.getMaxNestedArrays()))
        .closeHandler(    connection::end)
        .exceptionHandler(    connection::fail);
exceptionHandler

也需要同时声明以处理​vertx redis客户端#issue 227​中描述的情况

我认为官方文档可能需要一些改进。

分享
微博
QQ
微信
回复
2023-04-19 15:44:11
相关问题
如何使用ssl连接到PolarDB ?
1642浏览 • 1回复 待解决
docker容器内MySQL、Redis无法连接
1701浏览 • 1回复 待解决
如何查看使用MongoDB连接
2548浏览 • 1回复 待解决
golang redis客户端连接状态
1057浏览 • 1回复 待解决
GitLab中如何使用需要密码redis?
448浏览 • 1回复 待解决
相机surface可以直接到encoder吗
113浏览 • 1回复 待解决
鸿蒙图片资源在Java代码中如何使用
6353浏览 • 1回复 待解决