我试图在capnproto中实现类似boost的连接功能,在服务器启动之前阻塞和重试,或者使用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);
如果服务器关闭,显然会抛出异常。
所以我的问题是:
答案 0 :(得分: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
异常类型然后重试的位置,就像在上面的代码中一样。