2009-06-11 3 views
2

Я пытаюсь переместить систему с использованием morbid на rabbitmq, но я не могу получить то же самое поведение в области передачи, которое было предоставлено по умолчанию. По трансляции я имею в виду, что когда сообщение добавляется в очередь, каждый потребитель получает его. С кроликом, когда сообщение добавлено, они распределяются по кругу в стиле каждого слушателя.Stomp Broadcast с Rabbitmq и Python

Может ли кто-нибудь сказать мне, как достичь такого же распределения сообщений?

Библиотека топать используется ниже http://code.google.com/p/stomppy/

В противном случае быть в состоянии сделать с с топают, даже amqplib пример действительно поможет.

Мой код в настоящее время выглядит следующим образом

Потребитель

import stomp 

class MyListener(object): 
    def on_error(self, headers, message): 
     print 'recieved an error %s' % message 

    def on_message(self, headers, message): 
     print 'recieved a message %s' % message 

conn = stomp.Connection([('0.0.0.0', 61613), ('127.0.0.1', 61613)], 'user', 'password') 
conn.set_listener('', MyListener()) 
conn.start() 
conn.connect(username="user", password="password") 
headers = {} 

conn.subscribe(destination='/topic/demoqueue', ack='auto') 

while True: 
    pass 
conn.disconnect() 

И отправитель выглядит следующим образом

import stomp 

class MyListener(object): 
    def on_error(self, headers, message): 
     print 'recieved an error %s' % message 

    def on_message(self, headers, message): 
     print 'recieved a message %s' % message 

conn = stomp.Connection([('0.0.0.0', 61613), ('127.0.0.1', 61613)], 'user', 'password') 
conn.set_listener('', MyListener()) 
conn.start() 
conn.connect(username="user", password="password") 
headers = {} 

conn.subscribe(destination='/topic/demotopic', ack='auto') 

while True: 
    pass 
conn.disconnect() 

ответ

3

Я наконец-то понял, как это сделать, создав обмен для каждой «группы-получателя», im не уверен, насколько хорошо кролик будет делать с тысячами обменов, так что вам может показаться, что это сложно проверить, прежде чем попробовать его в производстве

в передающем коде:

conn.send(str(i), exchange=exchange, destination='') 

требуется заготовка назначения, мне все равно о посылаем на этот обмен

Получать

import stomp 
import sys 
from amqplib import client_0_8 as amqp 
#read in the exchange name so I can set up multiple recievers for different exchanges to tset 
exchange = sys.argv[1] 
conn = amqp.Connection(host="localhost:5672", userid="username", password="password", 
virtual_host="/", insist=False) 

chan = conn.channel() 

chan.access_request('/', active=True, write=True, read=True) 

#declare my exchange 
chan.exchange_declare(exchange, 'topic') 
#not passing a queue name means I get a new unique one back 
qname,_,_ = chan.queue_declare() 
#bind the queue to the exchange 
chan.queue_bind(qname, exchange=exchange) 

class MyListener(object): 
    def on_error(self, headers, message): 
     print 'recieved an error %s' % message 

    def on_message(self, headers, message): 
     print 'recieved a message %s' % message 

conn = stomp.Connection([('0.0.0.0', 61613), ('127.0.0.1', 61613)], 'browser', 'browser') 
conn.set_listener('', MyListener()) 
conn.start() 
conn.connect(username="username", password="password") 
headers = {} 

#subscribe to the queue 
conn.subscribe(destination=qname, ack='auto') 

while True: 
    pass 
conn.disconnect() 
3

Видимо, вы не можете сделать с непосредственно ТОПАЮТ; есть mailing list thread, который показывает все обручи, с которыми вы должны прыгать, чтобы получать трансляцию, работающую с топанием (в ней задействованы некоторые элементы AMPQ более низкого уровня).

+0

Спасибо, я уже видел этот поток и старался реализовать его предложения с помощью amqplib без успеха. Конкретным сообщением, которое затрагивает это, является http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2008-September/001786.html. Я обновил вопрос, чтобы отразить, что образец amqplib выполнит эту работу для меня. –