Pregunta

Im tratando de mover un sistema de usar mórbida a RabbitMQ, pero me parece que no puede conseguir el mismo comportamiento de difusión mórbida suministrada por defecto. Por difusión quiero decir que cuando se añade un mensaje a la cola, cada consumidor recieves ella. Con conejo, cuando se añade un mensaje que se distribuyen estilo round robin a cada oyente.

Puede alguien decirme cómo lograr el mismo tipo de distribución de mensajes?

La biblioteca pisar utilizado a continuación es http://code.google.com/p/stomppy/

De no ser capaz de ver con con pisotón, incluso un ejemplo amqplib sería una gran ayuda.

Mi código en la actualidad es el siguiente

El Consumidor

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

Y el remitente tiene este aspecto

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()
¿Fue útil?

Solución 2

Finalmente me di cuenta de cómo hacerlo mediante la creación de un intercambio para cada "grupo que recibe", no estoy seguro de qué tan bien el conejo va a hacer con miles de intercambios, así que sería bueno para averiguar prueba de esto en gran medida antes de probarlo en la producción

En el código de envío de:

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

Se requiere que el destino en blanco, todo lo que importa es el envío a que el intercambio

Para recibir

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

Otros consejos

Al parecer, no se puede hacer con directamente con STOMP; hay una lista de correo hilo que muestra todas las aros que tiene que saltar a través de la emisión de conseguir trabajar con pedal (se trata de un poco de materia AMPQ de nivel inferior).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top