java - 轮询客户端连接的正确方法是什么——Apache Thrift Server
问题描述
我对服务器端编程的经验很少,我正在承担一项任务,我需要使用 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() {
}
做这个的最好方式是什么?
解决方案
鉴于,我理解正确,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();
}
}
您正在寻找的无限循环被埋在server.serve();
. 如果这个想法真的与你写的相反(你有名为 的变量FEport
)并且你真正想要的是让 BE 连接 FE,那么你必须切换上述所有内容:BE=client,FE=server。
推荐阅读
- linux - Docker 容器命名在本地机器上更改为 hypens
- python - 检查点 (x1,y1) 是否位于两条平行线之间
- next.js - Next Js 主页在 Next JS 升级到 Next JS 11.1.2 后给我 404 Page not found
- visual-studio - 我可以强制 Visual Studio 不使用特定的第 3 方库吗?
- python - 为什么 Python 在尝试强制转换时认为我正在创建一个变量?
- java - RestAssured 自定义 TLS 版本
- python - 不使用绝对路径导入 Wheel 文件依赖
- .net - .NET Framework (mscorlib) 中的错误阻止堆栈跟踪行号(在便携式 pdb 中)?
- flutter - Flutter,有人知道如何使用这个 api 更新我的用户资料吗?使用 laravel api 颤动
- c++ - 如何解决由于函数中数组的默认值声明而导致的错误