publicación de mensajes usando kombu - El objeto TypeError 'str' no es invocable

Después de codificar la carga útil de mi mensaje en json, intento publicar en el corredor con:

connection = establish_connection()
producer = Producer(channel=connection,
                      exchange="inbound",
                      routing_key="apisubmit")

producer.publish(body=pl,headers={"api_access_key": "xxxx", "client_id": 4, "object_type": "location", "action": "c"})

django está devolviendo lo siguiente:

Traceback:
File "/usr/local/pythonenv/openblock/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/pythonenv/openblock/src/myblock/myblock/barz/views.py" in testtwo
  19.     msg=publish_kombu()
File "/usr/local/pythonenv/openblock/src/myblock/myblock/barz/messaging.py" in publish_kombu
  99.                           routing_key="apisubmit")
File "/usr/local/lib/python2.6/dist-packages/kombu/messaging.py" in __init__
  82.         self.exchange = self.exchange(self.channel)

Exception Type: TypeError at /barz/publish_kombu/
Exception Value: 'str' object is not callable

preguntado el 09 de marzo de 12 a las 22:03

2 Respuestas

Producer.exchange debe ser un Exchange. Por defecto es Exchange(""), de alguna manera debe haberlo configurado en una cadena.

respondido 10 mar '12, 16:03

Donde sea que estés pasando valor a 'Intercambio' param tiene que ser un Exchange objeto.

Su código tiene que ser:

exchange = Exchange(name='inbound') # the minimal declaration
connection = establish_connection()
producer = Producer(channel=connection,
                      exchange=exchange,
                      routing_key="apisubmit")

producer.publish(body=pl,headers={"api_access_key": "xxxx", "client_id": 4, "object_type": "location", "action": "c"})

Para ver la lista completa de parámetros de intercambio: documentos.


Encontré el mismo error en la declaración de la cola, es decir

queue = Queue(name=queue_name, exchange='host_tasks', routing_key=binding_key)
bound_queue = queue(channel) # only once bound, we can call declare(), purge(), delete() on exchange

Entonces declaró un intercambio, tal que

exchange = Exchange('host_tasks', 'direct', durable=True)
queue = Queue(name=queue_name, exchange=exchange, routing_key=binding_key)
bound_queue = queue(channel)

No olvides import Exchange

Respondido 29 Abr '16, 12:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.