2010-03-09 4 views
7

저는 Cassandra 및 Thrift 라이브러리에 대해 몇 가지 작업을하고 있습니다. 나는 이것들이 매우 초기의 도서관임을 깨닫고 (언젠가는) 어떤 점에서 바뀔 것이다.Thrift.Transport.TTransportException : null 출력 스트림에 쓸 수 없습니다.

저는 로컬 VirtualBox의 Ubuntu Server 인스턴스에서 실행중인 Cassandra 서버에서 읽고 쓰는 데 C# 코드를 설정하는 데 도움이되는 다음 link을 사용했습니다. 사소한 읽기/쓰기 기능이 제대로 작동하는지 확인했습니다.

나는 (카산드라와 함께 제공되는 thrift.definition 파일을 사용하여 나를 위해 생성 된) 다음과 같은 방법을 실행하는 데 문제가있어 여기서

TTransport _transport; 
TProtocol _protocol; 
Cassandra.Client _client; 

public Test() 
{ 
    _transport = new TSocket("192.168.56.101", 9160); 
    _protocol = new TBinaryProtocol(_transport); 
    _client = new Cassandra.Client(_protocol); 
} 
:

public void send_get_count(string keyspace, string key, ColumnParent column_parent, ConsistencyLevel consistency_level) 

가 여기 내 설정 코드의를

public void GetAllBlogEntries() 
    { 
     var timestamp = DateTime.Now.Millisecond; 
     var keyspace = "Keyspace1"; 

     var utf8Encoding = System.Text.Encoding.UTF8; 

     var columnParent = new ColumnParent() {Column_family = "BlogEntries"}; 
     var predicate = new SlicePredicate() 
     { 
      Slice_range = new SliceRange() 
          { 
           Start = new byte[0], 
           Finish = new byte[0], 
           Count = 10, 
           Reversed = false 
          } 
     }; 

     var results = _client.get_range_slice(keyspace, columnParent, predicate, "", "", 5, ConsistencyLevel.ONE); 

     foreach(var slice in results) 
     { 
      Console.WriteLine("Found Key: {0}", slice.Key); 
      foreach(var resultColumn in slice.Columns) 
      { 
       var column = resultColumn.Column; 
       Console.WriteLine("\tName: {0}, value: {1}", 
            utf8Encoding.GetString(column.Name), 
            utf8Encoding.GetString(column.Value));       
      } 
     } 
    } 

이 방법의 첫 번째 줄은 어디에 :과 같이

내 호출 코드가 보인다 예외 여기

oprot_.WriteMessageBegin(new TMessage("get_count", TMessageType.Call, seqid_)); 

그리고있다 :

가 Thrift.Transport.TTransportException : 내 예외를 얻고있다 Thrift.Transport.TStreamTransport.Write에서 를 OutputStream에 null로 쓸 수 없습니다를 (바이트 [] 버피, INT32 오프 Apache.Cassandra.Cassandra.Client.send_get_range_slice (문자열 키 스페이스, ColumnParent의 column_parent, SlicePredicate에서 Thrift.Protocol.TBinaryProtocol.WriteMessageBegin (TMessage 메시지) 에서 Thrift.Protocol.TBinaryProtocol.WriteI32 (INT32의 I32) 에서 INT32 렌) 술어, 문자열 start_key, 문자열 finish_key, Int32 row_count, ConsistencyLevel consis cassandra.cs의 라인 341 : Cassandra.Cassandra.Cassandra.Client.get_range_slice (String keyspace, ColumnParent column_parent, SlicePredicate 술어, 문자열 start_key, 문자열 finish_key, Int32 row_count, ConsistencyLevel consistency_level) 라인 335 라인 TestTest.cs에 CassandraDemo.Tests.Models.TestTest.Test_GetAllBlogEntries_Success()에서 212 : 라인 42

어떤 아이디어 Test.cs에 CassandraDemo.Models.Test.GetAllBlogEntries()에서?

+0

outputstream과 같은 소리는 null입니다. _client를 어떻게 초기화합니까? – Schildmeijer

+0

@Schildmeijer 설정 코드를 업데이트하겠습니다. 이 코드를 호출하기 전에 읽고 쓸 수 있기 때문에 객체가 확실히 만들어졌습니다. – karlgrz

+1

C#의 Cassandra를 실제로 사용하는 사람들은 실제로 그렇게 생각하지 않습니다. 따라서 여기에서 알아낼 수 없으면 cassandra-user 메일 링리스트에 질문 해보십시오. – jbellis

답변

13

전송시 Open()을 호출해야합니다.

+0

그게 다야! 나는 지난 밤에 기차의 집에서 그것을 알아 냈다. 그러나 방금 SO로 점검하기 위해 돌아왔다. 당신의 도움을 주셔서 감사합니다! – karlgrz

관련 문제