7

私は、RabbitMQブローカーからのジョブメッセージを受け入れてジョブを処理し、結果を別のサーバーに返すPythonクライアントを作成しています。RabbitMQブローカーにメッセージを送信するスクリプトは正常に起動しますが、channel.declare_queue(queue ='task_queue')を実行すると、ワーカーが次のエラーをスローします。

pika.exceptions.AMQPChannelError:(406、"PRECONDITION_FAILED-vhost'/'のキュー'task_queue'のパラメーターは同等ではありません")

クライアント:

import pika    
connection = pika.BlockingConnection(pika.ConnectionParameters(host=cmdargs.server))
channel = connection.channel()
channel.queue_declare(queue='task_queue')
channel.basic_qos(prefetch_count=1)
channel.basic_consume(ProcJobCallback, queue='task_queue')
channel.start_consuming()

RabbitMQと相互作用するサーバーメソッド:

def addNewJob(self, newJob):
        self.jobList.append(newJob)
        connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
        channel = connection.channel()
        channel.queue_declare(queue='task_queue')

        for tile in newJob.TileStatus:
                message = "{0},{1},{2}".format(newJob, tile[0], tile[1])
                channel.basic_publish(exchange='', routing_key='task_queue', body=message, properties=pika.BasicProperties(delivery_mode = 2, ))
        connection.close()

どんな助けや洞察も大歓迎です。

編集:上記のコードでエラーが発生した理由を発見しました。メッセージを公開するときにdelivery_mode=2を指定していましたが、キューを宣言したときに、Durable=Trueパラメーターを追加するのを忘れました。

4

3 に答える 3

3

キューが永続的である場合は、宣言「channel.queue_declare(queue='task_queue')」を削除するだけで十分です。

于 2016-01-22T18:03:26.737 に答える
2

パブリッシャー側とコンシューマー側で同じサーバー (ホスト) に接続していますか?

connection = pika.BlockingConnection(pika.ConnectionParameters(host=cmdargs.server))

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
于 2012-09-09T20:37:55.523 に答える
0

Durable=True でキュー msg を永続化しようとすると、同じ問題が発生します。

キュー名の名前を変更してみてください。私のスクリプトではうまく機能します。キューnew_taskを強制終了して、スクリプトを再実行することもできます。

于 2016-07-11T08:15:07.070 に答える