在capnproto中实现一个等待服务端的客户端连接函数
Implementing a client connection function that waits for the server in capnproto
我正在尝试在 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);
如果服务器宕机,显然会抛出异常。
所以我的问题是:
- 有没有办法注册一个回调来处理
connection/failure 要连接吗?
- capnproto 中是否有一个已经启用自动的内置机制
重新连接?
没有任何内置的东西,但您可以像这样很容易地实现它:
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
异常类型然后重试的地方,就像上面的代码一样。
我正在尝试在 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);
如果服务器宕机,显然会抛出异常。
所以我的问题是:
- 有没有办法注册一个回调来处理 connection/failure 要连接吗?
- capnproto 中是否有一个已经启用自动的内置机制 重新连接?
没有任何内置的东西,但您可以像这样很容易地实现它:
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
异常类型然后重试的地方,就像上面的代码一样。