2015-12-30 3 views
8

Я пытаюсь отправить словарь python от производителя python к потребителю python, используя RabbitMQ. Сначала производитель устанавливает соединение с локальным сервером RabbitMQ. Затем он создает очередь, на которую будет доставлен сообщение, и, наконец, отправляет сообщение. Сначала потребитель подключается к серверу RabbitMQ, а затем уверен, что очередь существует, создавая одну и ту же очередь. Затем он получает сообщение от производителя в функции обратного вызова и печатает значение «id» (1). Вот сценарии для производителя и потребителя:RabbitMQ: Как отправить словарь Python между производителем и потребителем Python?

producer.py сценарий:

import pika 
import sys 

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

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

message = {'id': 1, 'name': 'name1'} 
channel.basic_publish(exchange='', 
         routing_key='task_queue', 
         body=message, 
         properties=pika.BasicProperties(
         delivery_mode = 2, # make message persistent 
        )) 
print(" [x] Sent %r" % message) 
connection.close() 

consumer.py сценарий:

import pika 
import time 

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, properties, body): 
    print(" [x] Received %r" % body) 
    print(body['id']) 
    print(" [x] Done") 
    ch.basic_ack(delivery_tag = method.delivery_tag) 

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

channel.start_consuming() 

Но, когда я бегу producer.py, я получаю это ошибка:

line 18, in <module> 
    delivery_mode = 2, # make message persistent 
    File "/Library/Python/2.7/site-packages/pika/adapters/blocking_connection.py", line 1978, in basic_publish 
    mandatory, immediate) 
    File "/Library/Python/2.7/site-packages/pika/adapters/blocking_connection.py", line 2064, in publish 
    immediate=immediate) 
    File "/Library/Python/2.7/site-packages/pika/channel.py", line 338, in basic_publish 
    (properties, body)) 
    File "/Library/Python/2.7/site-packages/pika/channel.py", line 1150, in _send_method 
    self.connection._send_method(self.channel_number, method_frame, content) 
    File "/Library/Python/2.7/site-packages/pika/connection.py", line 1571, in _send_method 
    self._send_message(channel_number, method_frame, content) 
    File "/Library/Python/2.7/site-packages/pika/connection.py", line 1596, in _send_message 
    content[1][s:e]).marshal()) 
TypeError: unhashable type 

Может ли кто-нибудь мне помочь? Благодаря!

+0

Вы можете попробовать преобразовать ваше сообщение в объект JSON, а затем отправить. –

ответ

13

Вы не можете отправлять родные типы Python в качестве своей полезной нагрузки, вы должны сначала их сериализовать. Я рекомендую использовать JSON:

import json 
channel.basic_publish(exchange='', 
        routing_key='task_queue', 
        body=json.dumps(message), 
        properties=pika.BasicProperties(
        delivery_mode = 2, # make message persistent 
       )) 

и

def callback(ch, method, properties, body): 
print(" [x] Received %r" % json.loads(body)) 
+0

Спасибо! Я отправил сообщение успешно, но получил эту ошибку после запуска потребителя: ValueError: объект JSON не может быть декодирован – Malgi

+0

Ну, вы можете просто распечатать 'body', чтобы посмотреть, как он выглядит. JSON - это просто строка, поэтому она довольно легко обрабатывается человеком. – Turn

+0

Ошибка при исправлении формата сообщения json. Большое спасибо за ваше решение. Ты спас мой день :) – Malgi

Смежные вопросы