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

Java 轮询客户端连接的正确方法是什么——Apache Thrift Server,java,sockets,server-side,thrift,Java,Sockets,Server Side,Thrift,我几乎没有服务器端编程的经验,我正在承担一项任务,需要使用ApacheStrift实现后端服务器的一部分 现在,我的应用程序由一个“前端”服务器和一个“后端”服务器组成。前端服务器将对后端进行RPC调用 现在,如果我从命令行启动后端服务器,我希望该后端服务器保持活动状态,并在某种意义上保持对希望与其建立连接的其他节点的轮询。当前,当后端无法立即连接到前端节点时,它会抛出一个错误。现在的后端代码如下所示: public class BENode { public static void main(

我几乎没有服务器端编程的经验,我正在承担一项任务,需要使用ApacheStrift实现后端服务器的一部分

现在,我的应用程序由一个“前端”服务器和一个“后端”服务器组成。前端服务器将对后端进行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:Connection-densed)。但是,预期的行为是后端服务器将保持活动状态并保持轮询以建立与前端节点的连接,直到它最终能够成功连接。我很确定我不应该使用带有try-catch块的无限while循环,因为这是一种低效且糟糕的做法:

try{

     transport.open();
} catch() {

}

做这件事的最佳方法是什么?

鉴于此,我理解正确,FE应该连接到服务器。 那么,基本的想法是:

  • 启动BE Thrift服务器
  • 让FE Thrift客户端连接到它
由于BE旨在充当服务器,因此我们必须启动,而不是客户端:

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();
  }
}
您正在寻找的无限循环隐藏在
server.service()中。如果这个想法真的与你写的相反(你有一个名为
FEport
)的变量,你想要的是连接FE,那么你必须切换上面所有的:BE=client,FE=server