Thrift TSimpleServer 在多次成功请求后变得无响应

2023-12-29

我有一个 Thrift API,由在 Linux 上运行的 Java 应用程序提供服务。我正在使用 .NET 客户端连接到 API 并执行操作。

对该服务的前几次调用工作正常,没有错误,但随后(看似随机)调用将“挂起”。如果我强制退出客户端并尝试重新连接,服务要么再次挂起,要么我的客户端出现以下错误:

Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at Thrift.Transport.TStreamTransport.Read(Byte[] buf, Int32 off, Int32 len) 
   (etc.)

当我使用 JConsole 获取线程转储时,服务器已开启accept()

"Thread-1" prio=10 tid=0x00002aaad457a800 nid=0x79c7 runnable [0x00000000434af000]
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    - locked <0x00000005c0fef470> (a java.net.SocksSocketImpl)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at org.apache.thrift.transport.TServerSocket.acceptImpl(TServerSocket.java:113)
    at org.apache.thrift.transport.TServerSocket.acceptImpl(TServerSocket.java:35)
    at org.apache.thrift.transport.TServerTransport.accept(TServerTransport.java:31)
    at org.apache.thrift.server.TSimpleServer.serve(TSimpleServer.java:63)

netstat在服务器上显示与打开的服务端口的连接TIME_WAIT在我强制退出客户端几分钟后(正如预期的那样),它最终消失了。

设置Thrift服务的代码如下:

        int port = thriftServicePort;
        String host = thriftServiceHost;
        InetAddress adr = InetAddress.getByName(host);
        InetSocketAddress address = new InetSocketAddress(adr, port);
        TServerTransport serverTransport = new TServerSocket(address);
        TServer server = new TSimpleServer(new TServer.Args(serverTransport).processor((org.apache.thrift.TProcessor)processor));

        server.serve();

请注意,我们正在使用TServerTransport采用显式主机名或 IP 地址的构造函数。我怀疑我应该更改它以采用仅指定端口的构造函数(最终绑定到InetAddress.anyLocalAddress())。或者,我想我可以将服务配置为绑定到“通配符”地址(“0.0.0.0”)。

我应该提到的是,该服务不是托管在开放的互联网上。它托管在专用网络中,我使用 SSH 隧道来访问它。因此,服务绑定的主机名在我的本地网络中无法解析(尽管我可以通过隧道建立初始连接)。我想知道这是否类似于?

是否有对所发生情况的技术解释(如果这是一个常见问题),或者我可以采取的其他故障排除步骤?

UPDATE

今天也遇到同样的问题,但是这次jstack显示 Thrift 服务器永远阻塞从输入流读取:

"Thread-1" prio=10 tid=0x00002aaad43fc000 nid=0x60b3 runnable [0x0000000041741000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
        at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
        at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378)
        at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:297)
        at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:204)
        at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:22)
        at org.apache.thrift.server.TSimpleServer.serve(TSimpleServer.java:70)

所以我们需要在其中设置一个“客户端超时”TServerSocket构造函数。但是为什么这会导致应用程序在阻塞时也拒绝连接accept()?


从你的堆栈跟踪看来你正在使用 TSimpleServer,它的java文档说 http://people.apache.org/~thejas/thrift-0.9/javadoc/org/apache/thrift/server/TSimpleServer.html,

用于测试的简单单线程服务器。

可能你想要使用的是T线程池服务器 http://people.apache.org/~thejas/thrift-0.9/javadoc/org/apache/thrift/server/TThreadPoolServer.html.

最有可能发生的情况是 TSimpleServer 的单线程被阻塞,等待死客户端响应或超时。而且由于 TSimpleServer 是单线程的,因此没有线程可用于处理其他请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thrift TSimpleServer 在多次成功请求后变得无响应 的相关文章

  • WPF 媒体格式

    WPF 是否内置对任何音频和视频格式的支持 我将使用 MediaPlayer 和 MediaElement 类来构建一个小型媒体播放器 目前 我不想处理 NET 没有本机支持的编解码器和格式 WPF 默认支持视频格式 WMV MPEG 和一
  • 使用 Hibernate 或 Spring 打印 DBMS_OUTPUT.put_line

    我想知道 Hibernate 或 Spring 或任何第 3 方库是否提供将 DBMS OUTPUT put line 消息直接打印到 system out 或日志文件的能力 目的是在控制台中同时显示 PLSQL 日志消息和 java 日志
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • 寻找 WebElements,最佳实践

    在我们当前的自动化 使用 Selenium WebDriver Java 中 我们使用 FindBy very广泛地 例如 FindBy css a name bcrumb protected List
  • 如何使用 Gradle 2.10 将 ANTLR 词法分析器语法导入到另一个语法中?

    我一直在和 Terence Parr 一起学习 ANTLR 4权威的 ANTLR 4 参考 到目前为止我一直在使用 Gradle 2 10 及其内置 ANTLR 插件进行跟踪 然而 我在获取一些我从第 4 章第 38 41 页改编的代码以使
  • 在 Java 中查询 XML 的最简单方法

    我有带有 XML 的小字符串 例如 String myxml
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • Restful WS 中的 WSDL 等价物是什么?如果没有,消费者如何生成所需的客户端类?

    比如说 我在java中有生产者 在 net中有消费者 生产者有一个方法 需要 员工作为方法参数并在数据库中创建员工 对于基于 SOAP 的 ws dot net 客户端将调用 WSDL 并创建存根 包括 dot net 中的员工数据表示 现
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 使用 Mockitos 传递参数化输入

    我正在使用 Mockito 进行单元测试 我想知道是否可以使用 Junit 测试中的方式发送参数化输入参数 e g InjectMocks MockClass mockClass new MockClass Test public void
  • Jar Manifest 文件的使用混乱

    我正在阅读使用 jar 工具打包 java 应用程序 我注意到 META INF 目录下创建了一个清单文件 对于一个简单的应用程序来说 感觉它没有任何作用 我在 stackoverflow 上搜索以了解 Manifest 文件的用法 我碰到
  • 如何映射 Map

    I tried ManyToMany cascade CascadeType ALL Map
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • Google App Engine数据存储区字符串编码问题

    你好 我正在使用 Google App Engine 进行一个项目 并且需要存储一些字符串 我正在使用 Java 和JDOHelper getPersistenceManagerFactory transactions optional 在
  • 使用 Tomcat 和 gradle 进行休眠

    免责声明 我是 Java 新手 我正在尝试使用 Tomcat 和 Gradle 设置 Hibernate 构建运行正确 但看起来像persistence xml文件未被读取 我的项目结构如下 build gradle src main ja
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 用于验证的数据注释,至少有一个必填字段?

    如果我有一个包含字段列表的搜索对象 我可以使用 System ComponentModel DataAnnotations 命名空间将其设置为验证搜索中至少有一个字段不为 null 或空吗 即所有字段都是可选的 但至少应输入一个字段 我扩展
  • 如何检查 iPython 中对象的内存使用情况?

    我正在使用 iPython 来运行我的代码 我想知道是否有任何模块或命令可以让我检查对象的内存使用情况 例如 In 1 a range 10000 In 2 memusage a Out 2 1MB 就像是 memusage 并返回该对象使
  • 负载4096字节是否包含registration_id长度?

    在Android GCM文档中 据说有效负载最多为4096字节限制 负载的 4096 字节是否包括 Registration id 长度 我发现我可以发送一条有效负载为 16038 字节 包括 Registration ids 的消息 它不
  • PHP - 没有数据库存储信息

    我将改进 Apache 和 PHP 中的一个网站 该网站的页面上有一个包含文件列表的表 我的目标是允许用户根据某些特定和主观标准将这些文件之一设置为 重要 文件 为了做到这一点 我想以某种方式存储有关最 重要 文件的信息 但限制是我既不能使
  • 如何在 AWS Cloudformation 的“输出”中获取子网的“cidrblock”?

    我正在编写 AWS 代码结构 我必须打印子网的 Cidrblock 但这是行不通的 请帮忙 Resources Subnet Type AWS EC2 Subnet Properties VpcId Ref VPC CidrBlock 10
  • P2 存储库聚合器

    我们有几个内部 p2 存储库 每个存储库都有许多不同功能的版本 我们需要为客户提供一个外部更新站点 我们只想聚合特定功能的特定版本 聚合 它们是一个好方法 工具吗 例如我们有一个 p2 存储库repo1有特色feature1有版本1 0 0
  • 如何在数组中选择随机元素以避免(除非它是)某个值?

    例如 当用户连接到此应用程序时 他们会获得一个 userid var 然后将其插入到数组中 所以 我正在使用 chosenUser usersOnlineArray Math round Math random usersOnlineArr
  • # 的未定义方法“访问”(NoMethodError)[rspec]

    当我尝试运行 rspec 测试时出现以下错误 srv offerme spec requests static pages spec rb 13 undefined method visit for
  • 跳转到节点层次结构中的特定 SKNode

    我注意到 SKNode 方法children and childNodeWithName 顾名思义 仅返回查询节点正下方子节点的结果 IE root children 将返回一个NSArray包含节点 CUBE1 CUBE2 CUBE3 在
  • 无法通过应用程序配置连接自定义跟踪侦听器类 - ConfigurationErrorsException

    更新 现在不需要回答这个问题 我已经在下面解决了 您好 我正在尝试在 NET 中实现自定义跟踪侦听器 但在通过配置文件添加跟踪侦听器时遇到问题 我在堆栈溢出上找到了类似的帖子 但它似乎没有帮助 如何在 app config 中定义自定义 T
  • 为什么 Queue(T) 和 Stack(T) 不实现 ICollection(T)?

    在我提问之前 让我先给出一个显而易见的答案 The ICollection
  • 在 WP8 应用程序中反序列化 XML

    我正在尝试开发一个 Windows Phone 8 应用程序 我是 wp8 开发人员的新手 我有一个如下所示的 XML 文件
  • 在 ionic 3 应用程序中使用 JWT 进行身份验证

    我有一个 ionic 3 应用程序 我想在其中使用 touchId 功能 后端 API 正在 net 中开发 对于我的身份验证模型 我认为在用户输入登录名和密码并通过服务器身份验证后 它会发回 JWT 令牌 我可以将令牌存储在本地 然后每次
  • 我可以修改并排程序集搜索顺序吗?

    我有一个 Windows C 软件项目 使用 Visual Studio 2005 SP1 构建 具有以下 简化的 文件布局 App Root Directory bin Microsoft VC80 CRT Microsoft VC80
  • 如何使用 pymongo 将集合转储到 json 文件

    我正在尝试将集合转储到 json 文件 但在查看 pymongo 教程后 我找不到任何与之相关的内容 教程链接 https api mongodb com python current tutorial html https api mon
  • JBoss 再次 vs Tomcat [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当我将图像上传到数据库时,nonetype'对象没有属性'解码'错误

    我是 ionic4 angular4 的新手 我需要将个人资料图片上传到数据库 我编写了代码 但我不知道它是否正确 当我上传它时 我收到上述错误 支持我正在使用 Django 对于不好的缩进感到抱歉 我只是编程初学者 ts async se
  • 查找从 SASS 编译的 CSS 文件的来源

    我正在开发的项目有一个复杂的样式表库 其中包含多个 scss 供应商库以及许多填充有 scss 文件的文件和文件夹 这些文件和文件夹被编译为单个 css 文件 当我想对 css 进行简单的更改时 我必须花费大量时间在文件结构中搜索源 scs
  • 使用 WCF Restful 服务的 PDF

    任务 当用户单击链接时能够呈现 PDF 这是 WCF 服务 示例 http localhost 6186 MyReportServices svc reports 012 http localhost 6186 MyReportServic
  • Thrift TSimpleServer 在多次成功请求后变得无响应

    我有一个 Thrift API 由在 Linux 上运行的 Java 应用程序提供服务 我正在使用 NET 客户端连接到 API 并执行操作 对该服务的前几次调用工作正常 没有错误 但随后 看似随机 调用将 挂起 如果我强制退出客户端并尝试