[rabbitmq-discuss] dead-letter-exchange behaviour
    cogitate 
    monish.unni at gmail.com
       
    Wed Aug  1 17:00:00 BST 2012
    
    
  
hi mathias:
i am trying to get dead-letter-exchange work.. 
 steps below: 
[0] s2.direct is an exchange that declares a dead-letter-exchange(DLE)
called s2.dlx ( rabbitmq ) 
[1] setup DLE consumer -  declares a DLQ (pyDlxQueue) binds to DLE(s2.dlx) 
[2] setup a consumer listening to queue (EchoPayMe) binds to
s2.direct(exchange) 
    queue EchoPayMe setup with arguments x-message-ttl=10 and DLE=s2.dlx 
    the consumer also sleeps for 100 seconds ( to simulate
long-running/hanging service) 
    the idea is a producer puts 10 messages in it's queue will only have
message 1 served, 
    the rest of the messages should go to DLE(s2.dlx) when the DLE consumer
replies. 
[3] the producer - publish messages to s2.direct exchange w/ rk="EchoPayMe" 
the problem is no messages are received by the DLQ or get routed to the DLE
consumer. 
the code for the DLE consumer, App consumer and App Producer in python/pika
below. 
i am sure there's a fundamental error in what i am doing, cause, i can get
it working (somewhat) with java 
code (the x-message-ttl = 10 doesn't really hold the messages for 10 ms only
before returning, so i am somewhat puzzled by that, but at least the DLE
consumer gets the message) 
regards, 
-monish 
-- DLE Consumer-- 
connection = pika.BlockingConnection(pika.ConnectionParameters( 
        host='localhost')) 
channel = connection.channel() 
result = channel.queue_declare(queue='pyDlxQueue') 
queue_name = result.method.queue 
channel.queue_bind(exchange='s2.dlx', 
                   queue=queue_name) 
                   #routing_key='pyDlxQueue') 
def on_request(ch, method, props, body): 
    print " [x] pyDLX Got %r " % (body,) 
    response = "ERROR FROM pyDLX" 
    ch.basic_publish(exchange='', 
                     routing_key=props.reply_to, 
                     properties=pika.BasicProperties(correlation_id = \ 
                                                     props.correlation_id), 
                     body=str(response)) 
    ch.basic_ack(delivery_tag = method.delivery_tag) 
channel.basic_consume(on_request, queue='pyDlxQueue',no_ack=False) 
print " [x] pyDLX consumer started " 
channel.start_consuming() 
--  Consumer --- 
connection = pika.BlockingConnection(pika.ConnectionParameters( 
        host='localhost')) 
channel = connection.channel() 
result =
channel.queue_declare(queue='EchoPayMe',exclusive=False,auto_delete=True,durable=False,arguments={'x-dead-letter-exchange':'s2.dlx','x-message-ttl':10}) 
queue_name = result.method.queue 
channel.queue_bind(exchange='s2.direct', 
                   queue=queue_name, 
                   routing_key='EchoPayMe') 
def on_request(ch, method, props, body): 
    sleep_time = 100 
    print " [x] Got %r with corr_id=%r \n ======Sleeping for %s seconds
=============" % (body,props.correlation_id,sleep_time) 
    time.sleep(sleep_time) 
    response = "Got "+ body 
    print "[x] Returning response %r" %(response,) 
    ch.basic_publish(exchange='', 
                     routing_key=props.reply_to, 
                     properties=pika.BasicProperties(correlation_id = \ 
                                                     props.correlation_id), 
                     body=str(response)) 
    ch.basic_ack(delivery_tag = method.delivery_tag) 
#channel.basic_qos(prefetch_count=1) 
channel.basic_consume(on_request, queue='EchoPayMe') 
print " [x] Awaiting service requests" 
channel.start_consuming() 
-- Producer -- 
class EchoClient(object): 
    def __init__(self): 
        self.connection = pika.BlockingConnection(pika.ConnectionParameters( 
                host='localhost')) 
        self.channel = self.connection.channel() 
    def call(self, request): 
        self.response = None 
        self.corr_id = str(uuid.uuid4()) 
        self.channel.basic_publish(exchange='s2.direct', 
                                   routing_key='EchoPayMe', 
                                   properties=pika.BasicProperties( 
                                   correlation_id=self.corr_id,), 
                                   body=request) 
echoClient = EchoClient() 
total_count = 10 
for i in xrange(total_count): 
    print " [x] Calling echoService %d"%(i,) 
    request=str(i) 
    echoClient.call(request) 
--
View this message in context: http://rabbitmq.1065348.n5.nabble.com/dead-letter-exchange-behaviour-tp21167.html
Sent from the RabbitMQ mailing list archive at Nabble.com.
    
    
More information about the rabbitmq-discuss
mailing list