私は websockets から始めていますが、数のライブラリと構成オプションに非常に混乱しています。node.js サーバーが python/django のメソッドを呼び出すプロジェクトをセットアップしたいだけで、最後のメソッドが終了すると、結果が node.js サーバーに転送されます。これは私がこれまでに持っているものです:
このチュートリアルの Nodes.js AMQP :
var conn = amqp.createConnection();
conn.on('ready', function(){
var exchange = conn.exchange('?1', {'type': 'fanout', durable: false}, function() {
exchange.publish('?2', {add: [1,2]});
});
});
このチュートリアルの Django Celery :
from celery.decorators import task
@task()
def add(x, y):
return x + y
これが進むべき道かどうかはわかりません。誰かがこの問題に光を当てることができれば幸いです。
---編集
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) {
console.log("received message: ");
console.log(msg.data.toString());
});
});
exchange.publish('task_queue', "it works!", {
'replyTo' : 'incoming'
});
});
});
それでも、これが最適な実装かどうかはわかりません。ここでは queue.bind() メソッドを使用していません。複雑なオブジェクト (json または単純な配列) を渡そうとすると、問題が発生します。この行を変更する
body= (["a","b","c"])#str(response))
次のエラーが発生します。
Traceback (most recent call last):
File "test.py", line 56, in <module>
channel.start_consuming()
File "/Library/Python/2.7/site-packages/pika/adapters/blocking_connection.py", line 293, in start_consuming
(...)
File "/Library/Python/2.7/site-packages/pika/simplebuffer.py", line 62, in write
self.buf.write(data)
TypeError: must be string or read-only character buffer, not list
複雑なオブジェクトをシリアル化するための解決策はありますか? 何か不足していますか?