我正在 Thrift 中开发“代理”服务器。我的问题是,每个连接到代理的连接都使用相同的处理程序实例。代理的客户端实现在 Handler 中,因此所有客户端都通过相同的连接与终端服务器进行通信。
我有:n 个客户端 -> n 个套接字 -> 1 个处理程序 -> 1 个套接字 -> 1 个服务器 我想要实现的是:n 个客户端 -> n 个套接字 -> n 个处理程序 -> n 个套接字 -> 1 个服务器
现在的问题是,如果客户端更改服务器上的“本地”参数(为每个客户端独立定义的参数),其他客户端也将在更改后的环境中工作。
shared_ptr<CassProxyHandler> handler(new CassProxyHandler(adr_s,port_s,keyspace));
shared_ptr<TProcessor> processor(new CassandraProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TFramedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TThreadedServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
有没有办法实现一个服务器,为每个服务器套接字创建一个新的处理程序实例,而不是使用相同的处理程序?
感谢您的任何建议或帮助, @
最佳答案
我已经设法解决了这个问题。已经有一个用 Java 实现的解决方案。我使用了相同的想法并在 C++ 中实现了它。
我做的第一件事是创建了一个 TProcessorFactory 而不是 TTransport 类。这会处理每个连接的 TProcessors。它里面有一个map结构,所以它的get函数为每个TTransport返回对应的TProcessor。每个客户端对应的(唯一的)TProcessor。
我必须创建一个新的 TServer,因此它会接受新创建的参数 TProcessorFactory 而不是 TProcessor。在 TServer 中还需要更改几个函数调用。您的 getProcessor 函数将不再返回 TProcessor,而是返回 TProcessorFactory(因此更改返回类型并重命名)。
您要做的最后一件事是实现一个允许实例化的服务器,即 TServer 的派生类。我建议使用 TNonblockingServer(实现更改有点困难)或 TThreadPoolServer。您必须更改几个函数调用。在 TProcessorFactory 上使用带有 TTransport 参数的 get 函数在需要的地方获取 TProcessor。 TTransport 参数对于每个线程都是唯一的,每个客户端连接都由一个线程处理。
还要确保删除旧的 TProcessors,因为 thrift 重用(至少使用 TNonblockingServer)TTransport,所以如果你不删除它们并且客户端连接,他可能会得到一个不活动的先前 session ,而你可能不会不想要它。如果使用共享指针,只需将它们从 map 结构中移除,当客户端断开连接时,如果 thrift 不再需要它们,它们将被销毁。
我希望这对遇到我遇到的同样问题的任何人有所帮助。如果您不知道 thrift 的内部结构,这里有一个很好的指南:http://diwakergupta.github.com/thrift-missing-guide/
我希望 Thrift 开发人员能够在不久的将来实现类似但更复杂和抽象的解决方案。
@
关于c++ - Thrift - 每个套接字都有不同的 Handler 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6622682/