2016-05-25 8 views
0

私finagleサーバーの問題は、:スリフトデバッグ:finagleとScalaで実装され、私はシンプルなスリフトサーバーを持っている

import com.twitter.util.{ Await, Future } 
    import com.jakiku.thriftscala.{ RealTimeDatabasePageImpressions, PageImpressions } 
    import com.twitter.finagle.Thrift 
    import com.twitter.finagle.thrift.ThriftServerFramedCodec 
    import com.twitter.finagle.builder.{ ServerBuilder, Server } 

    object ThriftServer { 

     def main(args: Array[String]) { 
     val server = Thrift.serveIface("localhost:9090", new RealTimeDatabasePageImpressions[Future] { 
      def getByTrackIdAndDay(trackId: Int, day: Int) = { 
      Future(Seq(PageImpressions.apply(123, 3, 4, 3, 2000L, 2000L))) 
      } 
     }) 
     Await.ready(server) 
     } 
    } 

は、これは私のスリフトファイルです:私はScalaの倹約クラスを生成

namespace java com.jakiku.thriftjava 
    #@namespace scala com.jakiku.thriftscala 

    typedef i64 long 
    typedef i32 int 

    struct PageImpressionsSum{ 
     1: required int   trackId; 
     2: required int   day; 
     3: required int   hour; 
     4: required int   minute; 
     5: required string  pageId; 
     6: required long  uniqueImpressions; 
     7: required long  sumImpressions; 
    } 

    struct PageImpressions{ 
     1: required int   trackId; 
     2: required int   day; 
     3: required int   hour; 
     4: required int   minute; 
     6: required long  uniqueImpressions; 
     7: required long  sumImpressions; 
    } 

    service RealTimeDatabase_pageImpressions{ 
     list<PageImpressions> getByTrackIdAndDay(1:int trackId, 2:int day); 
    } 

    service RealTimeDatabase_pageImpressionsSum { 
     list<PageImpressionsSum> getByTrackIdAndDay(1:int trackId, 2:int day); 
    } 

スクルージと一緒に。依存関係としてthriftlib、scrooge-core、scrooge-generatorなどを追加しました。私はまた、scrooge sbtプラグインを追加しました:

addSbtPlugin("com.twitter" % "scrooge-sbt-plugin" % "4.5.0") 

私はsudo sbt 'run'でサーバを起動しました。コンソールの出力:Finagleバージョン6.34.0:

は、[情報] 舞25、2016 ThriftServer 4時18分39秒AMを実行com.twitter.finagle.Init $$ anonfun $ 1 $ MCV $ SP 情報を適用します(rev = 44f444f606b10582c2da8d5770b7879ddd961211)20160310-155158

現時点では問題はありません。私はnodejsでサーバーをテストしました。動作しません。私はまた、リサイクルPythonテストスイートを使用しました。すべてのチェックはタイムアウトになります。

var thrift = require('thrift'); 
    var Realtime_pageImpressions = require('./gen-nodejs/RealTimeDatabase_pageImpressions.js'); 
    var ttypes = require('./gen-nodejs/RealTimeDatabase_types.js'); 


    var connection = thrift.createConnection("localhost", 9090); 

    connection.on('error', function(err) { 
     console.log(err); 
    }); 

    var client = thrift.createClient(Realtime_pageImpressions, connection); 

    client.getByTrackIdAndDay(123124, 4, function(err, response) { 
     if (err) { 
     console.error(err); 
     } else { 
     console.log(response); 
     } 
    }); 

私は本当に私が間違ってやっている見当がつかない:

これはnodejsクライアントです。

答えて

0

さて、私はそれを修正しました。 2つのこと:@BCGは私にヒントを与えました。 TFramedTransportです。しかし、Apache Docuは少し古すぎます。

var ThriftTransports = require('thrift/transport'); 
var ThriftProtocols = require('thrift/protocol'); 

倹約/輸送およびリサイクル/プロトコルはもう存在しません。あなたは倹約を要求するだけです。関数の実行のための2つの括弧も削除しました。

var thrift = require('thrift'); 
    var Int64 = require('node-int64'); 
    var Realtime_pageImpressions = require('./gen-nodejs/RealTimeDatabase_pageImpressions.js'); 
    var ttypes = require('./gen-nodejs/RealTimeDatabase_types.js'); 

    transport = thrift.TFramedTransport; 
    protocol = thrift.TBinaryProtocol; 

    var connection = thrift.createConnection("localhost", 9090, { 
     transport : transport, 
     protocol : protocol 
    }); 

    connection.on('error', function(err) { 
     console.log(err); 
    }); 

    // Create a Calculator client with the connection 
    var client = thrift.createClient(Realtime_pageImpressions, connection); 

    client.getByTrackIdAndDay(123124, 4, function(err, response) { 
     if (err) { 
     console.error(err); 
     } else { 
     console.log(response); 
     console.log(response[0].uniqueImpressions[0]); 
     } 
    }); 
1

これが問題であるかどうかは不明です(特にscroogeやfinagleに慣れていないため)が、サーバー上でFramedトランスポートを使用しているように見えますが、クライアント上にない可能性があります。

node.js Thriftライブラリコードを見ると、TBufferedTransportがデフォルトのように見えますが、代わりにTFramedTransportが必要な場合があります。 node.js Thrift tutorial page

、彼らはあなたがオーバーライドされたオプションとの接続を初期化する方法を示しています

var thrift = require('thrift'); 
var ThriftTransports = require('thrift/transport'); 
var ThriftProtocols = require('thrift/protocol'); 
var Calculator = require('./gen-nodejs/Calculator'); 
var ttypes = require('./gen-nodejs/tutorial_types'); 

transport = ThriftTransports.TBufferedTransport() 
protocol = ThriftProtocols.TBinaryProtocol() 

var connection = thrift.createConnection("localhost", 9090, { 
    transport : transport, 
    protocol : protocol 
}); 

あなたはTFramedTransportと交換し、それが助けかどうかを確認除いて、上記のように、あなたのNode.jsクライアントを実装してみてください。

+0

ThriftServerFramedCodecはインポートされますが使用されません。変更しましたが、これは解決策ではありません。 –

関連する問題