2013-08-20 1 views
2

Я хочу начать с того, что я новичок не только в python, но и в программировании вообще. Имея это в виду, это моя проблема. Я пытаюсь отправить некоторые данные на сервер Rabbitmq. Ниже приведен код Python. Json_data - это просто переменная, которая содержит некоторые форматированные json данные.Kombu - Публикация сообщений для ошибки rabbitmq - TypeError: объект 'str' не может быть вызван

with Connection("amqp://username:[email protected]_server.local:5672/#/") as conn: 
    channel = conn.channel() 
    producer = Producer(channel, exchange = "test_exchange", serializer="json") 

    producer.publish(json_data) 

print "Message sent" 

Это производит следующее сообщение об ошибке:

Traceback (most recent call last): File "test.py", line 43, in <module> producer = Producer(channel, exchange = "test_exchange", serializer="json") File "/Library/Python/2.7/site-packages/kombu/messaging.py", line 83, in __init__ self.revive(self._channel) File "/Library/Python/2.7/site-packages/kombu/messaging.py", line 210, in revive self.exchange = self.exchange(channel) TypeError: 'str' object is not callable

Любая помощь будет оценена. Благодарю.

ответ

1

После того, как я ударил головой о стол, я понял, что Питону не нравится вызов биржи. Тогда мой коллега сказал мне, что это может сработать лучше, если я включу ключ обмена и маршрутизации в издателе. Итак, теперь мой новый код выглядит так.

# Creates the exchange and queue and binds them 
# If already created on the server side these steps are not needed 
exchange = Exchange("test_exchange", "direct", durable=True) 
queue = Queue("test_q", exchange = exchange, routing_key = "test") 

# The last foreword slash is the virtual host 
with Connection("amqp://username:[email protected]:5672/", "/") as conn: 
    channel = conn.channel() 
    producer = Producer(channel, exchange = exchange, serializer="json") 

    for key, value in json_data.items(): 
     producer.publish(exchange = exchange, routing_key = "test", body = {key:value}) 

print "Message sent!" 
0

я отвечаю на вопрос - а ваш ответ не имеет реальной проблемы, выявленной т.е. TypeError: 'str' object is not callable at self.exchange = self.exchange(channel) - состояния, которые вы проходящие неправильный тип к exchange парам т.е. пропусканием «str» к exchange :

producer = Producer(channel, exchange = "test_exchange", serializer="json") 

Решение: Где бы вы проездом значение "обмена Парам имеет чтобы быть объектом Exchange.

Вашего код должен быть:

with Connection("amqp://username:[email protected]_server.local:5672/#/") as conn: 
    channel = conn.channel() 
    exchange = Exchange(name='inbound') # the minimal declaration 
    producer = Producer(channel, exchange=exchange, serializer="json") 

    producer.publish(json_data) 

print "Message sent" 

Для полного списка Биржевых пар - docs.


Я столкнулся с той же ошибки при объявлении очереди т.е.

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 

Так объявлен обмен, например thah

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

Не забудьте импортировать Exchange