使用Rabbitmq和Python进行Stomp广播

时间:2009-06-11 14:03:18

标签: python broadcast rabbitmq stomp

我试图将系统从使用病态移动到rabbitmq,但我似乎无法获得默认情况下提供的相同广播行为病态。通过广播,我的意思是当消息被添加到队列中时,每个消费者都会收到消息。使用兔子,当添加消息时,它们会以循环方式分发给每个听众。

有谁能告诉我如何实现相同类型的邮件分发?

下面使用的stomp库是http://code.google.com/p/stomppy/

无法使用stomp,即使是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()

2 个答案:

答案 0 :(得分:3)

显然你不能直接使用STOMP;有一个mailing list thread显示你必须跳过的所有箍以使用stomp进行广播(它涉及一些较低级别的AMPQ东西)。

答案 1 :(得分:3)

我终于想出了如何通过为每个“接收组”创建一个交换来实现它,我不确定兔子将如何做好成千上万的交换,所以你可能想要在生产中尝试之前进行大量测试< / p>

在发送代码中:

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