2012-11-12 31 views
5

Tôi đang cố gắng sử dụng Apache Thrift để chuyển các tin nhắn giữa các ứng dụng được thực hiện bằng các ngôn ngữ khác nhau. Nó không nhất thiết phải được sử dụng như RPC, nhưng nhiều hơn cho serializing/deserializing tin nhắn. Một ứng dụng nằm trong node.js. Tôi đang cố gắng tìm ra cách Apache tiết kiệm hoạt động với node.js, nhưng tôi không thể tìm thấy quá nhiều tài liệu và ví dụ, ngoại trừ một tài liệu nhỏ liên quan đến Cassandra tại: https://github.com/apache/thrift/tree/trunk/lib/nodejsTiết kiệm của Apache với các ví dụ về nodejs

Một lần nữa, tôi không cần bất kỳ các quy trình được khai báo trong tệp .thrift, tôi chỉ cần tuần tự hóa cấu trúc dữ liệu đơn giản như:

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

Có thể giúp tôi làm ví dụ không?

Trả lời

4

Câu trả lời ở trên là sai, vì nó cố gắng sử dụng trực tiếp bộ đệm ngoài, đây là một mảng bộ đệm. Dưới đây là một ví dụ làm việc của việc sử dụng tiết kiệm với 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

Xin lỗi, nhưng bạn deserialize trong cùng một kịch bản cùng một dữ liệu được tạo ra. Nhưng nếu sử dụng một số lưu trữ trung gian (thỏmq) dữ liệu chính xác để lưu trữ trong thỏ? Sliced ​​outBuffers? Hoặc gọi mỗi lần tuôn ra và gọi lại lưu dữ liệu? Và sử dụng slice cho byteArray không phải là ý tưởng tốt mỗi lần bởi vì nó không sao chép dữ liệu, nhưng làm cho tham chiếu đến nó. – Selvatico

6

Cuối cùng tôi đã tìm thấy câu trả lời cho câu hỏi này, sau khi lãng phí rất nhiều thời gian chỉ bằng cách xem thư viện cho các nút.

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

Tại thời điểm này, các mảng byte có thể được tìm thấy trong các lĩnh vực transport.outBuffers:

var byteArray = transport.outBuffers; 

Đối deserialization:

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

Ngoài ra các dòng sau đây cần phải được thêm vào tệp index.js từ thư viện nodejs để tiết kiệm:

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

Ngoài ra còn có ít nhất một lỗi trong thư viện nodejs.

1

DigitalGhost là đúng, ví dụ trước là sai. IMHO the outBuffers là tài sản riêng tư của lớp vận chuyển và không nên truy cập.