org.apache.thrift.transport.TTransportException:无法读取。远端已关闭

Posted

技术标签:

【中文标题】org.apache.thrift.transport.TTransportException:无法读取。远端已关闭【英文标题】:org.apache.thrift.transport.TTransportException: Cannot read. Remote side has closed 【发布时间】:2013-08-17 03:48:42 【问题描述】:

我刚开始使用 astyanax 连接到 cassandra(1.2.8)。 我从 [https://github.com/Netflix/astyanax] 下载了 astyanax,从 [http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.8/apache-cassandra- 1.2.8-bin.tar.gz]。一切都是根据指​​令安装/构建并保持默认设置(如 conf/cassandra.yaml)。现在我尝试运行示例代码 [https://github.com/Netflix/astyanax/blob/master/astyanax-examples/src/main/java/com/netflix/astyanax/examples/AstCQLClient.java] 和一个令人作呕的错误一直困扰着我(在 Eclipse 中显示):

原因:com.netflix.astyanax.connectionpool.exceptions.PoolTimeoutException:PoolTimeoutException:[host=127.0.0.1(127.0.0.1):9160,latency=5021(5021),尝试=1]等待连接超时

当我启用 cassandra 调试模式时,终端上会显示以下内容:

DEBUG 17:06:48,968 在处理消息期间发生 Thrift 传输错误。 org.apache.thrift.transport.TTransportException:无法读取。远程端已关闭。试图读取 4 个字节,但只得到 0 个字节。 (这通常表示服务器端存在内部错误。请检查您的服务器日志。) 在 org.apache.thrift.transport.TTransport.readAll(TTransport.java:86) 在 org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378) 在 org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:297) 在 org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:204) 在 org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:22) 在 org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:199) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:724)

只是强调一下,我没有更改 cassandra.yaml 中的任何内容(实际上我不知道它们是什么意思);来自 astyanax 和 cassandra-1.2.8 的所有库都导入到 java 项目中。 我想问题是由于当我尝试通过帧转换刷新时连接将关闭......我是数据库的菜鸟。我非常感谢所有的帮助!

ps。我正在等待***。如果您需要检查任何日志(请同时给我找到它的目录。我是菜鸟>_

【问题讨论】:

任何解决方案?我看到了同样的事情。 【参考方案1】:

尽管这是一个老问题,我不确定我的建议是否会帮助任何人,但我遇到了同样的错误,这就是我解决它的方法。希望这能帮助另一个可怜的人。

我看到同样的错误“无法读取远程端已关闭”,但我使用的是 csharp、Apache.Cassandra 命名空间和 Thrift.dll。

下面是一个工作的sn-p,

    TSocket socket = null;
    TTransport transport = null;

    socket = new TSocket("localhost", 9160);


    transport = new TFramedTransport(socket);
    TProtocol protocol = new TBinaryProtocol(transport);
    CassandraClient cassandraClient = new CassandraClient(protocol);
    cassandraClient.InputProtocol.Transport.Open();

诀窍是使用 cassandraClient.InputProtocol.Transport.Open();而不是 transport.open()

【讨论】:

以上是关于org.apache.thrift.transport.TTransportException:无法读取。远端已关闭的主要内容,如果未能解决你的问题,请参考以下文章