轮询客户端连接的正确方法是什么 -- Apache Thrift Server

What is the Proper way to Poll for Client Connections -- Apache Thrift Server

提问人:Universal Thinker 提问时间:6/12/2020 更新时间:6/12/2020 访问量:361

问:

我在服务器端编程方面的经验很少,而且我正在承担一项任务,我需要使用 Apache thrift 实现后端服务器的一部分。

现在,我的应用程序由一个“前端”服务器和一个“后端”服务器组成。前端服务器将对后端进行 RPC 调用。

现在,如果我从命令行启动后端服务器,我希望该后端服务器保持活动状态,并且在某种意义上,继续轮询想要与之建立连接的其他节点。目前,后端在无法立即连接到前端节点时只会吐出错误。现在的后端代码如下所示:

public class BENode {
public static void main(String [] args) throws Exception {

...


    TSocket sock = new TSocket(hostFE, portFE);
    TTransport transport = new TFramedTransport(sock);
    TProtocol protocol = new TBinaryProtocol(transport);
    BcryptService.Client client = new BcryptService.Client(protocol);
    transport.open();
}
}

我相信当前端 (FE) 节点无法连接时,这是引发异常(java.net.ConnectException:连接被拒绝)的最后一行。但是,预期的行为是后端服务器将保持活动状态,并继续轮询以与前端节点建立连接,直到它最终能够成功连接。我很确定我不应该使用带有 try-catch 块的无限 while 循环,因为这是低效且糟糕的做法:

try{

     transport.open();
} catch() {

}

最好的方法是什么?

Java 套接字 服务器端 节俭

评论


答:

1赞 JensG 6/12/2020 #1

鉴于,我理解正确,FE 应该连接 BE 服务器。 那么,基本思想是这样的:

  • 启动 BE Thrift 服务器
  • 让 FE Thrift 客户端连接到它

由于 BE 旨在充当服务器,因此我们必须启动一个 Thrift 服务器,而不是客户端:

public static void simple(Calculator.Processor processor) {
  try {
    TServerTransport serverTransport = new TServerSocket(9090);
    TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
    System.out.println("Starting the simple server...");
    server.serve();
  } catch (Exception e) {
    e.printStackTrace();
  }
}

你要找的无限循环被埋在 中。如果这个想法真的与你写的相反(你有名为的变量),并且你真正想要的是让 BE 连接 FE,那么你必须切换上述所有内容:BE=client,FE=server。server.serve();FEport