Комиссионный сервер: обнаружение отключений клиента (библиотека C ++)

При работе с Thrift-сервером необходимо обрабатывать случаи, когда клиент неожиданно отключается. Это может произойти, когда сервер обрабатывает RPC. Это не редкое явление, если на сервере есть блокирующий вызов, который часто используется для ожидания операции с целью уведомления клиентов об асинхронных событиях. В любом случае, это угловой случай, который может случиться и происходит на любом сервере, и очистка часто необходима.

К счастью, Thrift предоставляет класс TServerEventHandler для подключения к обратным вызовам подключения / отключения. Раньше это работало в предыдущих версиях Thrift (я полагаю, 0.8), используя библиотеку C ++ и именованный транспортный канал. Однако в Thrift 0.9.1 обратные вызовы createContext () и deleteContext () запускаются сразу при подключении клиента. Ни один из клиентов больше не отключается. Есть ли новый способ обнаружения клиентских отключений?

Фрагмент кода:

//============================================================================
//Code snippet where the server is instantiated and started. This may
//or may not be syntactically correct.
//The event handler class is derived from TServerEventHandler.
//
{
boost::shared_ptr<MyHandler> handler(new MyHandler());
boost::shared_ptr<TProcessor> processor(new MyProcessor(handler));
boost::shared_ptr<TServerTransport> serverTransport(new TPipeServer("MyPipeName"));
boost::shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
boost::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

boost::shared_ptr<TServer> server(new TSimpleServer(processor, transport, tfactory, pfactory));
boost::shared_ptr<SampleEventHandler> EventHandler(new SampleEventHandler());

server->setServerEventHandler(EventHandler);
server->serve();
}

//============================================================================
//Sample event callbacks triggered by the server when something interesting
//happens with the client.
//Create an overload of TServerEventHandler specific to your needs and
//implement the necessary methods.
//
class SampleEventHandler : public server::TServerEventHandler {
public:
SampleEventHandler() :
NumClients_(0) //Initialize example member
{}

//Called before the server begins -
//virtual void preServe() {}

//createContext may return a user-defined context to aid in cleaning
//up client connections upon disconnection. This example dispenses
//with contextual information and returns NULL.
virtual void* createContext(boost::shared_ptr<protocol::TProtocol> input, boost::shared_ptr<protocol::TProtocol> output)
{
printf("SampleEventHandler callback: Client connected (total %d)\n", ++NumClients_);
return NULL;
}

//Called when a client has disconnected, either naturally or by error.
virtual void deleteContext(void* serverContext, boost::shared_ptr<protocol::TProtocol>input, boost::shared_ptr<protocol::TProtocol>output)
{
printf("SampleEventHandler callback: Client disconnected (total %d)\n", --NumClients_);
}

//Called when a client is about to call the processor -
//virtual void processContext(void* serverContext,
boost::shared_ptr<TTransport> transport) {}

protected:
uint32_t NumClients_; //Example member
};

1

Решение

Если createContext () и deleteContext () оба вызываются при клиентском подключении без отсоединения клиента, это ошибка и должна быть проблема, созданная в Thrift jira.

1

Другие решения


По вопросам рекламы [email protected]