vertx断路器再也不会关闭

时间:2017-06-22 07:54:00

标签: rx-java vert.x circuit-breaker

我的circuitBreaker有问题。如果我正确地向我的服务发送请求电路OPEN,并解决超时错误。在设置超时后,电路进入HALF_OPEN状态 - 应有的一切。 但是从这里开始,电路再也不会关闭。每个请求都会导致错误并立即再次打开电路。

我使用cb通过vertx eventBus在我的服务之间进行通信,如下所示:

return this.circuitBreaker.rxExecuteCommandWithFallback(
  future -> this.vertx.eventBus().rxSend("myEvent", myBody)
    .subscribe(
      data -> future.complete(data.body().toString()),
      err -> future.fail(err.getMessage())
    ), Throwable::getMessage);

我的circuitBreaker选项:

return new CircuitBreakerOptions()
  .setMaxFailures(10)
  .setTimeout(2000L)
  .setResetTimeout(5000L)
  .setMaxRetries(2)
  .setFallbackOnFailure(true);

我的配置错了吗?我可能使用rxified API错误吗?

修改 如果我在docker容器中运行我的代码我只是得到错误: io.vertx.core.impl.NoStackTraceThrowable: operation timeout

如果我在本地启动应用程序,我会发现PG / SQL实际上抛出了sorry, too many clients异常。这肯定会解释为什么电路仍然打开,但由于我已经关闭了我的客户成功和错误,我真的不明白为什么会发生这种情况。

-

似乎我当前在请求后关闭连接的方式是错误的。当我通过SELECT * FROM pg_stat_activity where state = 'idle'检查我的数据库连接时,我可以看到没有请求实际上正确终止。

我执行db查询的java代码如下所示:

final AsyncSQLClient client = PostgreSQLClient.createShared(vertx, getConnectionData(), "mypool");
return client
  .rxGetConnection()
  .flatMap(conn -> conn.rxQuery(sql))
  .map(res -> {
    client.rxClose();
    return res;
  })
  .doOnError(err -> {
    client.rxClose();
  });

我使用io.vertx:vertx-mysql-postgresql-client:3.4.1作为驱动程序

0 个答案:

没有答案