2015-12-30 11 views
8

Sto provando ad inviare un dizionario python da un produttore python a un utente python usando RabbitMQ. Il produttore stabilisce prima la connessione al server RabbitMQ locale. Quindi crea una coda a cui verrà recapitato il messaggio e infine invia il messaggio. L'utente si connette prima al server RabbitMQ e quindi si assicura che la coda esista creando la stessa coda. Quindi riceve il messaggio dal produttore all'interno della funzione di callback e stampa il valore 'id' (1). Qui ci sono gli script per il produttore e consumatore:RabbitMQ: Come inviare il dizionario Python tra il produttore e il consumatore Python?

sceneggiatura producer.py: lo script

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() 

Ma, quando ho eseguito il producer.py, ottengo questo errore:

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 

Qualcuno potrebbe aiutarmi? Grazie!

+0

Puoi provare convertire il messaggio a un oggetto JSON e poi inviare. –

risposta

13

Non è possibile inviare tipi di Python nativi come payload, è necessario serializzarli per primi. Mi consiglia di utilizzare JSON:

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

e

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

Grazie! Ho inviato il messaggio correttamente, ma ho ricevuto questo errore dopo l'esecuzione del consumer: ValueError: nessun oggetto JSON può essere decodificato – Malgi

+0

Bene, puoi semplicemente stampare 'body' per vedere come appare. JSON è solo una stringa, quindi è piuttosto semplice da analizzare. – Turn

+0

Nessun errore dopo aver corretto il formato del messaggio JSON. Grazie mille per la tua soluzione. Hai salvato la mia giornata :) – Malgi

Problemi correlati