0

我正在尝试在 capnproto 中实现类似 boost 的 connect 函数,它会阻塞并重试直到服务器启动,或者 basic_socket::async_connect 让我实现一个回调来尝试再次连接。

例如,运行以下代码:

auto ioContext = kj::setupAsyncIo();
auto address = ioContext.provider->getNetwork()                                              
               .parseAddress("localhost:7500").wait(ioContext.waitScope);
auto connection = address->connect().wait(ioContext.waitScope);

如果服务器关闭,显然会抛出异常。

所以我的问题是:

  1. 有没有办法注册一个回调来处理连接/连接失败?
  2. capnproto 中是否有已经启用自动重新连接的内置机制?
4

1 回答 1

3

没有任何内置的东西,但你可以很容易地实现它,如下所示:

kj::Promise<kj::AsyncIoStream> keepTryingConnect(kj::NetworkAddress& addr) {
  return addr.connect().catch_(
      [&addr](kj::Exception&& e) -> kj::Promise<kj::Own<kj::AsyncIoStream>> {
    if (e.getType() == kj::Exception::Type::DISCONNECTED) {
      // Try again.
      return keepTryingConnect(addr);
    } else {
      // Propagate error.
      return kj::mv(e);
    }
  });
}

请注意,DISCONNECTED异常类型是任何类型的瞬态网络错误的包罗万象,并且明确用于这种目的。

至于在断开连接时重新连接:系统无法自动执行此操作,因为 Cap'n Proto 不知道重试飞行中的请求是否安全,也不知道如何重建连接上存在的任何功能。您需要做的是在应用程序中找到可以捕获DISCONNECTED异常类型然后重试的位置,就像上面的代码一样。

于 2018-04-22T17:38:57.163 回答