2012-11-12 14 views
5

Sto cercando di utilizzare Apache Thrift per il trasferimento di messaggi tra applicazioni implementate in lingue diverse. Non è necessariamente usato come RPC, ma più per serializzare/deserializzare i messaggi. Un'applicazione è in node.js. Sto cercando di capire come Apache parsimonia funziona con node.js, ma non riesco a trovare troppa documentazione e gli esempi, ad eccezione di una piccola uno per quanto riguarda Cassandra a: https://github.com/apache/thrift/tree/trunk/lib/nodejsApache Thrift con esempio nodejs

Anche in questo caso, non ho bisogno di alcun procedure dichiarate nel file .thrift, ho solo bisogno di serializzare una semplice struttura di dati come:

struct Notification { 
    1: string subject, 
    2: string message 
} 

qualcuno mi può aiutare con un esempio?

risposta

4

La risposta sopra è sbagliata, perché tenta di utilizzare outBuffer direttamente, che è una matrice di buffer. Ecco un esempio di lavoro di usare parsimonia con nodejs:

var util = require('util'); 
var thrift = require('thrift'); 

var Notification = require('./gen-nodejs/notification_types.js').Notification; 

var TFramedTransport = require('thrift/lib/thrift/transport').TFramedTransport; 
var TBufferedTransport = require('thrift/lib/thrift/transport').TBufferedTransport; 
var TBinaryProtocol = require('thrift/lib/thrift/protocol').TBinaryProtocol; 

var transport = new TFramedTransport(null, function(byteArray) { 
    // Flush puts a 4-byte header, which needs to be parsed/sliced. 
    byteArray = byteArray.slice(4); 

    // DESERIALIZATION: 
    var tTransport = new TFramedTransport(byteArray); 
    var tProtocol = new TBinaryProtocol(tTransport); 
    var receivedNotification = new Notification(); 
    receivedUser.read(tProtocol); 

    console.log(util.inspect(receivedNotification, false, null)); 
}); 

var binaryProt = new TBinaryProtocol(transport); 

// SERIALIZATION: 
var notification = new Notification({"subject":"AAAA"}); 
console.log(util.inspect(notification, false, null)); 
notification.write(binaryProt); 
transport.flush(); 
+0

Siamo spiacenti, ma hai deserializzato nello stesso script gli stessi dati che sono stati creati. Ma se usi qualche archivio intermedio (rabbitmq) quali dati esattamente memorizzare in coniglio? Beccati a fette? Oppure chiama ogni volta a filo e in callback salva i dati? E usare slice per byteArray non è una buona idea ogni volta perché non copia i dati, ma fa riferimento ad essa. – Selvatico

6

Ho finalmente trovato la risposta a questa domanda, dopo aver perso un sacco di tempo solo guardando la libreria per nodejs.

//SERIALIZATION: 
var buffer = new Buffer(notification); 
var transport = new thrift.TFramedTransport(buffer); 
var binaryProt = new thrift.TBinaryProtocol(transport); 
notification.write(binaryProt); 

A questo punto, l'array di byte può essere trovato nel campo transport.outBuffers:

var byteArray = transport.outBuffers; 

Per deserializzazione:

var tTransport = new thrift.TFramedTransport(byteArray); 
var tProtocol = new thrift.TBinaryProtocol(tTransport); 
var receivedNotif = new notification_type.Notification(); 
receivedNotif.read(tProtocol); 

Anche le seguenti linee devono essere aggiunti il file index.js dalla libreria nodejs per la parsimonia:

exports.TFramedTransport = require('./transport').TFramedTransport; 
exports.TBufferedTransport = require('./transport').TBufferedTransport; 
exports.TBinaryProtocol = require('./protocol').TBinaryProtocol; 

Inoltre, vi è anche almeno un bug nella libreria nodejs.

1

DigitalGhost è di destra, l'esempio precedente è sbagliato. IMHO the outBuffers è una proprietà privata per la classe di trasporto e non dovrebbe essere accessibile.