Question

Im essayant de déplacer un système à l'aide morbide à rabbitmq, mais je ne peux pas sembler obtenir le même comportement de diffusion morbide fourni par défaut. Par diffusion Je veux dire que lorsqu'un message est ajouté à la file d'attente, chaque consommateur reçoit lui. Lapin, lorsqu'un message est ajouté qu'ils sont distribués style round robin à chaque auditeur.

Quelqu'un peut-il me dire comment obtenir le même genre de distribution de message?

La bibliothèque de Stomp utilisé ci-dessous est http://code.google.com/p/stomppy/

A défaut d'être en mesure de le faire avec Stomp, même un exemple amqplib pourrait vraiment aider.

Mon code à l'heure actuelle ressemble à ceci

Le consommateur

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

Et l'expéditeur ressemble à ceci

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()
Était-ce utile?

La solution 2

J'ai finalement compris comment le faire en créant un échange pour chaque « groupe recieving », je ne suis pas sûr de savoir comment le lapin va faire avec des milliers d'échanges, de sorte que vous pouvez comprendre tester ce fortement avant de l'essayer dans la production

Dans le code envoi:

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

La destination vide est nécessaire, tout ce que je me soucie de envoie à cet échange

Pour recevoir

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

Autres conseils

Apparemment, vous pouvez pas faire avec directement avec STOMP; il y a un liste de diffusion fil qui montre toutes les cerceaux vous devez sauter à travers pour obtenir la diffusion de travailler avec Stomp (il implique des trucs AMPQ bas niveau).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top