2010-03-09 14 views
7

Estoy trabajando con las bibliotecas de Cassandra y Thrift. Me doy cuenta de que estas son bibliotecas muy antiguas y que (indudablemente) cambiarán en algún momento.Thrift.Transport.TTransportException: No se puede escribir en null outputstream

He estado utilizando el siguiente link para obtener ayuda con la configuración de mi código C# para escribir y leer desde y hacia mi servidor Cassandra (que tengo funcionando en una instancia de Ubuntu Server en mi VirtualBox local). Confirmé que funciona la funcionalidad trivial de lectura/escritura.

Dónde estoy teniendo un problema es ejecutar el método siguiente (que se generó para mí utilizando el archivo thrift.definition que viene con Cassandra):

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

Aquí está mi código de configuración:

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); 
} 

Mi código de llamada se ve así:

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));       
      } 
     } 
    } 

La primera línea de este método es donde Me estoy haciendo mi excepción:

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

Y aquí es la excepción:

Thrift.Transport.TTransportException: No se puede escribir en nulo OutputStream en Thrift.Transport.TStreamTransport.Write (Byte buf [], Int32 off, Int32 len) en Thrift.Protocol.TBinaryProtocol.WriteI32 (Int32 i32) en Thrift.Protocol.TBinaryProtocol.WriteMessageBegin (mensaje TMessage) en Apache.Cassandra.Cassandra.Client.send_get_range_slice (String keyspace, ColumnParent column_parent, SlicePredicate predicado, String start_key, String finish_key, Int32 row_count, ConsistencyLevel consis tency_level) en Cassandra.cs: línea 341 en Apache.Cassandra.Cassandra.Client.get_range_slice (String keyspace, ColumnParent column_parent, SlicePreredicate predicate, String start_key, String finish_key, Int32 row_count, ConsistencyLevel consistency_level) en Cassandra.cs: línea 335 en CassandraDemo.Models.Test.GetAllBlogEntries() en Test.cs: línea 212 en CassandraDemo.Tests.Models.TestTest.Test_GetAllBlogEntries_Success() en TestTest.cs: línea 42

alguna idea?

+0

Parece que el outputtream es nulo. ¿Cómo inicializar _client? – Schildmeijer

+0

@Schildmeijer Voy a actualizar con mi código de configuración. El objeto definitivamente se crea, porque puedo leer y escribir antes de llamar a este código. – karlgrz

+1

No creo que ninguna de las personas que realmente utilizan Cassandra de C# estén realmente en SO, así que si no puede entenderlo aquí, intente preguntar en la lista de correo de usuarios de cassandra. – jbellis

Respuesta

13

Debe llamar a Open() en el transporte.

+0

¡Eso es todo! Me di cuenta de eso anoche en el tren a casa, pero volví al trabajo para verificar SO. ¡Gracias por tu ayuda! – karlgrz

Cuestiones relacionadas