我的代码中有以下架构:
我真正想要的是能够在客户端崩溃时取消任务。
让我解释:
假设我有以下服务处理程序方法:
// inside thrift handler
// this method is currently instanciated once and called by every client
void do_stuff(const std::string& parameter)
{
auto task = make_task(parameter);
auto future_result = task .get_future();
add_to_queue(task);
auto status = resultFuture.wait_for(timeout); // wait here until the task is over
if (status != std::future_status::timeout)
{
return future_result.get();
}
}
Run Code Online (Sandbox Code Playgroud)
如果客户端崩溃/断开连接,则无需再处理该任务,因此我想尽快取消它(从我的队列中删除)。
为此,我有以下想法:
1/ 使用Thrift 服务器中的setServerEventHandler方法在客户端断开连接时收到通知(deleteContext 方法)。它工作得很好,但我无法知道哪个请求是由哪个特定客户端发出的:在我的处理程序中,我无权访问客户端信息,并且我无法使用(或未能设法)创建的 void * 上下文通过我的 ServerEventHandler 中的 creatContext 方法
2/ 使用我的处理程序对象的构造函数和析构函数将 1 个客户端链接到 1 个处理程序。然后,当客户端断开连接时,我只需取消他在处理程序析构函数中请求的每个任务。目前我有 N 个客户端和 1 个处理程序,所以它不起作用。我想我可以使用 TMultiplexedProcessorFactory 但 thrift 中没有这样的类。当我想注册一个由客户端创建一个处理程序实例的工厂时,TMultiplexedProcessor 必须注册处理器(使用单个处理程序)。我可以实现我自己的 TMultiplexedProcessorFactory,但我认为这可能有充分的理由尚不存在。
知道我应该做什么吗?
我可以将其发布在https://issues.apache.org/中,但这不完全是 thrift 的问题(顺便说一句,很棒的 lib),而不是一个问题,即 SO。
预先感谢,请随时询问更多详细信息
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |