1

クライアントが '/test' に対して get 要求を行うと、node.js と python の間で AMQP を介して単純な文字列が交換されますが、応答をクライアントに送信する方法がわかりません (プロセスが非同期であるため)。

test.py

 import pika
 connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
 channel = connection.channel()

 channel.queue_declare(queue='task_queue', durable=True)

 print ' [*] Waiting for messages. To exit press CTRL+C'

 def callback(ch, method, props, body):
     print " [x] Received %r" % (body,)
     response = body + " MODIFIED"
     #response = get_a_concept()
     print " [x] Done"
     ch.basic_publish(exchange='',
                 routing_key=props.reply_to,
                 properties=pika.BasicProperties(correlation_id = \
                                                 props.correlation_id),
                 body=str(response))
     ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
                  queue='task_queue')

channel.start_consuming()

app.js

 var connection = amqp.createConnection({ host: 'localhost' });
 connection.addListener('ready', function() {


var exchange = connection.exchange('', {
    'type' : 'direct',
    durable : false
        }, function() {

    var queue = connection.queue('incoming', {
        durable : false,
        exclusive : true }, function() {
        queue.subscribe(function(msg) {

           // got response here, how to transmit it to the node that made the exchange?
            console.log("received message: ");
            console.log(msg.data.toString());
        });

      });

    });
});

ユーザーリクエストはpythonに公開されますが、終了したらユーザーに返信するにはどうすればよいですか?

app.get('/test', loadUser, function(req, res) {

console.log("sent");
exchange.publish('task_queue', "funciona!", {
    'replyTo' : 'incoming'
});

res.redirect('/home'); 

});

(注: これが最適な実装かどうかはわかりません。ヒント、提案を歓迎します!)

4

1 に答える 1

0

私は次のようにそれを解決しました:

要求側は、メッセージを送信するときに返信先ヘッダーと相関 ID ヘッダーを設定し、返信を処理するために必要な情報 (私の場合は NodeJS、コールバック) を相関 ID をインデックスとしてリストに格納します。

応答側は、reply-to をルーティング キーとして直接交換に発行し、メッセージにcorrelation-id を設定します。

メッセージがリクエスタに戻ってくると、リストから必要な情報を取得 (および削除) し、応答を処理します。

編集:もちろん、タイムアウトなどを処理したい場合は、さらに作業が必要ですが、それはすべてユースケースによって異なります。

于 2012-11-22T07:50:31.357 に答える