2016-10-27 9 views
0

コールバックが公開されず、メソッドがキュー内で実行されていても、メッセージがタイムアウトになるという奇妙な問題があります。これはいくつかの特定のキューで発生し、一度起こった後、私は以前に働いたクライアントから他の要求を行うことはできません、彼らはすべてタイムアウトします。クライアントを再起動して、再度動作させる必要があります。 これは起こっているコードで、何が間違っているのか理解しているようです。RabbitMQリクエスト、常にタイムアウト

ここではキューを作成しています。私はそのようなキューをいくつか持っています、これはそれらの一つです。ここで

var amqp = require('amqp'); 
var util = require('util'); 
var cnn = amqp.createConnection({host:'127.0.0.1'}); 
var getCart = require('./services/getCart'); 

cnn.on('ready', function() { 

    cnn.queue('getCart_queue', function(q){ 
      q.subscribe(function(message, headers, deliveryInfo, m){ 

       // util.log(util.format(deliveryInfo.routingKey, message)); 
       // util.log("Message: "+JSON.stringify(message)); 
       // util.log("DeliveryInfo: "+JSON.stringify(deliveryInfo)); 

       getCart.handle_request(message, function(err,res){ 
        cnn.publish(m.replyTo, res, { 
         contentType:'application/json', 
         contentEncoding:'utf-8', 
         correlationId:m.correlationId 
        }); 
       }); 
      }); 
     }); 
}); 

、ハンドル要求機能が正常に完了しましたが、コールバックはを通過しないと、常にもう一方の端にタイムアウト

var cart = require('../models/cart'); 

function handle_request(msg, callback) { 

    var user_id = msg.id; 
    cart 
     .find({id:user_id}) 
     .populate('users ads') 
     .exec(function(err, results){ 

         // This works, just the callback doesnt 

      if(!err){ 
       console.log(results); 
       callback(null, results); 
      } else { 
       console.log(err); 
       callback(err, null); 
      } 

     }); 

} 

exports.handle_request = handle_request; 

決してこれは私が要求

var msg_payload = {"id":id}; 
    mq_client.make_request('getCart_queue', msg_payload, function(err, results){ 
     console.log(results); // never prints 
     //stuff that is never reached 
}); 
を呼び出していますどのようになっています

These are my rpc files、私は他のキューがうまくいくので、何か問題があるはずがないと思います。 そして、このクライアント

GET /getCart - - ms - - 
Error: timeout 6ee0bd2a4b2ba1d8286e068b0f674d8f 
    at Timeout.<anonymous> (E:\Ebay_client\rpc\amqprpc.js:32:18) 
    at Timeout.ontimeout [as _onTimeout] (timers.js:341:34) 
    at tryOnTimeout (timers.js:232:11) 
    at Timer.listOnTimeout (timers.js:202:5) 

に示すエラーは、あなたがより多くを必要とする場合、私に知らせてください、情報が曖昧ではありません願っています。ありがとう!

私はデバッグしようとしましたが、rabbitmqサーバーからコールバックが呼び出されていて、相関IDと変数への返信があるため、リクエストが取得されないここに。

var amqp = require('amqp') 
    , crypto = require('crypto'); 

var TIMEOUT=8000; 
var CONTENT_TYPE='application/json'; 
var CONTENT_ENCODING='utf-8'; 
var self; 

exports = module.exports = AmqpRpc; 

function AmqpRpc(connection){ 
    self = this; 
    this.connection = connection; 
    this.requests = {}; 
    this.response_queue = false; 
} 


AmqpRpc.prototype.makeRequest = function(queue_name, content, callback){ 

    self = this; 
    var correlationId = crypto.randomBytes(16).toString('hex'); 


    var tId = setTimeout(function(corr_id){ 

    callback(new Error("timeout " + corr_id)); 
    delete self.requests[corr_id]; 
    }, TIMEOUT, correlationId); 

    var entry = { 
    callback:callback, 
    timeout: tId 
    }; 

    self.requests[correlationId]=entry; 


    self.setupResponseQueue(function(){ 


    self.connection.publish(queue_name, content, { 
     correlationId:correlationId, 
     contentType:CONTENT_TYPE, 
     contentEncoding:CONTENT_ENCODING, 
     replyTo:self.response_queue}); 
    }); 
}; 


AmqpRpc.prototype.setupResponseQueue = function(next){ 

    if(this.response_queue) return next(); 

    self = this; 

    self.connection.queue('', {exclusive:true}, function(q){ 

    self.response_queue = q.name; 

    q.subscribe(function(message, headers, deliveryInfo, m){ 
     var correlationId = m.correlationId; 

     if(correlationId in self.requests){ 

     var entry = self.requests[correlationId]; 
     clearTimeout(entry.timeout); 
     delete self.requests[correlationId]; 

     entry.callback(null, message); 
     } 
    }); 
    return next();  
    }); 
}; 
+0

タイムアウトが表示されますよう、すべての文を確認してください。問題に関連するすべてのコードが質問に詳述されている場合は、私たちが答えて、歴史のために提案するほうがよいでしょう。 – lao

+0

ちょっと、私はrpcファイルのgithubリンクにmake要求ファイルを投稿しました。それはあまりにも混乱するようにコード全体を示していませんでした。 https://github.com/vansh007/Twitter-Clone-MEAN-stack/blob/master/Tw_Client/rpc/amqprpc.js –

答えて

0

rabbitMQでは問題はありませんでしたが、ハンドル要求で、要求に応答した後にクエリが実行されました。

この問題に来て他の人のために

、チェックして、二重のエラーがコンソールに表示されませんが、唯一のあなたにも `make_request`メソッドのソースコードを表示する必要があり

0

これはあなたのmake_request()client.js内のファイルのコードです:あなたは、なぜこれが可能性があり

rpc.makeRequest(queue_name, msg_payload, function(err, response){ 
    if(err) 
     console.error(err); 
     // 
     //HERE: should be a callback call here. 
     // 
    else{ 
     console.log("response", response); 
     callback(null, response); 
    } 

}); 

:あなたはrpc.makeRequest()にERRを持っているときに何が起こるかで

var amqp = require('amqp'); 

var connection = amqp.createConnection({host:'127.0.0.1'}); 
var rpc = new (require('./amqprpc'))(connection); 


function make_request(queue_name, msg_payload, callback){ 

    rpc.makeRequest(queue_name, msg_payload, function(err, response){ 
     if(err) 
      console.error(err); 
     else{ 
      console.log("response", response); 
      callback(null, response); 
     } 

    }); 
} 

exports.make_request = make_request; 

はルックタイムアウトを取得しています。私はそれが助けて欲しい

+0

タイムアウトエラーがここに表示され、コールバックにエラーが処理されますが、状況は同じです。私の問題は、どこからエラーが発生しているのかを見つけることです。どんなアイデアを探すべきか? –

関連する問題