如果服务器出现故障,我正在处理的应用程序不会重新连接到 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);
}
});
我最近遇到了同样的问题。而且我相信您正在像我一样从顶点文档中粘贴官方建议的重新连接代码:
我可以验证你的情况,我在 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中描述的情况
我认为官方文档可能需要一些改进。