mirror of https://github.com/celery/kombu.git
add amqp style routing for virtual channels, allows memory
backend to behave like amqp
This commit is contained in:
parent
5ea899d035
commit
f8ee383cc3
|
@ -0,0 +1,70 @@
|
|||
from kombu.connection import BrokerConnection
|
||||
from kombu.messaging import Exchange, Queue, Consumer, Producer
|
||||
|
||||
# configuration, normally in an ini file
|
||||
exchange_name = "test.shane"
|
||||
exchange_type = "topic"
|
||||
exchange_durable = True
|
||||
message_serializer = "json"
|
||||
queue_name = "test.q"
|
||||
|
||||
# 1. setup the connection to the exchange
|
||||
# hostname,userid,password,virtual_host not used with memory backend
|
||||
cons_conn = BrokerConnection(hostname="localhost",
|
||||
userid="guest",
|
||||
password="guest",
|
||||
virtual_host="/",
|
||||
transport="memory")
|
||||
cons_chan = cons_conn.channel()
|
||||
cons_exch = Exchange(exchange_name, type=exchange_type, durable=exchange_durable)
|
||||
|
||||
pub_conn = BrokerConnection(hostname="localhost",
|
||||
userid="guest",
|
||||
password="guest",
|
||||
virtual_host="/",
|
||||
transport="memory")
|
||||
pub_chan = pub_conn.channel()
|
||||
pub_exch = Exchange(exchange_name, type=exchange_type, durable=exchange_durable)
|
||||
|
||||
# 2. setup the consumer, the consumer declares/creates the queue, if you
|
||||
# publish to a queue before there is a consumer it will fail unless the queue
|
||||
# was first created and is durable
|
||||
class AConsumer:
|
||||
def __init__(self, queue_name, key):
|
||||
self.queue = Queue(queue_name, exchange=cons_exch, routing_key=key)
|
||||
self.consumer = Consumer(cons_chan, [self.queue])
|
||||
self.consumer.consume()
|
||||
|
||||
def mq_callback(message_data, message):
|
||||
print("%s: %r: %r" % (key, message.delivery_info, message_data,))
|
||||
#message.ack()
|
||||
self.consumer.register_callback(mq_callback)
|
||||
|
||||
c1 = AConsumer("test_1","test.1")
|
||||
c2 = AConsumer("testing","test.ing")
|
||||
# consumers can use simple pattern matching when defining a queue
|
||||
c3 = AConsumer("test_all","test.*")
|
||||
|
||||
# 3. publish something to consume
|
||||
# publishers always send to a specific route, the mq will route to the queues
|
||||
producer = Producer(pub_chan, exchange=pub_exch, serializer=message_serializer)
|
||||
producer.publish({"name": "Shane Caraveo", "username": "mixedpuppy"}, routing_key="test.1")
|
||||
producer.publish({"name": "Micky Mouse", "username": "donaldduck"}, routing_key="test.ing")
|
||||
producer.publish({"name": "Anonymous", "username": "whoami"}, routing_key="test.foobar")
|
||||
|
||||
def have_messages():
|
||||
return sum([q.qsize() for q in cons_chan.queues.values()])
|
||||
|
||||
# 5. run the event loop
|
||||
while have_messages():
|
||||
try:
|
||||
cons_conn.drain_events()
|
||||
except KeyboardInterrupt:
|
||||
print
|
||||
print "quitting"
|
||||
break
|
||||
except Exception, e:
|
||||
import traceback
|
||||
print traceback.format_exc()
|
||||
break
|
||||
|
Loading…
Reference in New Issue