[rabbitmq-discuss] Channel Cost

Ben Hyde bhyde at pobox.com
Tue Jan 27 20:54:09 GMT 2009

On Jan 27, 2009, at 2:34 PM, Jason J. W. Williams wrote:
> Hi Barry,
> chan_send
> .basic_publish
> (msg,exchange=args.exchange,routing_key=args.routing_key)
> to an exchange that doesn't exist.

Sometime ago, as Dmitriy had pointed out, Matthias suggested that a  
synchronous call to RabbitMQ is a good way to see if it has consumed  
the frames we previously dispatched to it.  And presumably that also  
allows amqplib a chance to see any errors that consumption sent back.   
Dmitriy suggested using declare_exchange as possible choice for a  
synchronous call to the broker, and Matthias made some other  

So in the following ping_channel does a meaningless exchange_declare.

Jason's example of how to get basic_publish to have an error:

On Jan 27, 2009, at 2:34 PM, Jason J. W. Williams wrote:
> ...chan_send 
> .basic_publish 
> (msg,exchange=args.exchange,routing_key=args.routing_key)
> to an exchange that doesn't exist. ..

So the following code does that, followed by calling ping_channel.   
The transcript below shows amqplib reporting the error as soon as it  
reads off that the channel is closing.

The source:

#!/usr/bin/env python
import amqplib.client_0_8 as amqp
import logging
from os import environ

def ping_channel(channel):
     channel.exchange_declare("RANDOMTEXT",type='topic', passive=True)

if __name__ == '__main__':
     logger = logging.getLogger('amqplib')
     def trace(m): logger.debug('TRACE: ' + m)
     trace('create connection')
     connection = conn =  
     trace('create channel')
     channel = connection.channel()
     channel.access_request(vhost, active=True, write=True)
     exchange_name = environ.get('AMQP_EXCHANGE','ampq.topic')
#    exchange = channel.exchange_declare(exchange_name,
     trace('make message')
     msg = amqp.Message("Hi there", content_type='text/plain')
     channel.basic_publish(msg, exchange_name,  

The transcript:
bash-3.2$ env - PATH=$PATH AMQP_SERVER= AMQP_EXCHANGE=bogus  
TRACE: create connection
 > (10, 10): Connection.start
Start from server, version: 8.0, properties: {u'platform': 'Erlang/ 
OTP', u'product': 'RabbitMQ', u'version': '1.5.0', u'copyright':  
'Copyright (C) 2007-2009 LShift Ltd., Cohesive Financial Technologies  
LLC., and Rabbit Technologies Ltd.', u'information': 'Licensed under  
the MPL.  See http://www.rabbitmq.com/'}, mechanisms: ['PLAIN',  
'AMQPLAIN'], locales: ['en_US']
< (10, 11): Connection.start_ok
 > (10, 30): Connection.tune
< (10, 31): Connection.tune_ok
< (10, 40): Connection.open
 > (10, 41): Connection.open_ok
Open OK! known_hosts [elm.cozy.org:5672]
TRACE: create channel
using channel_id: 1
< (20, 10): Channel.open
 > (20, 11): Channel.open_ok
Channel open
TRACE: access_request
< (30, 10): Channel.access_request
 > (30, 11): Channel.access_request_ok
TRACE: make message
TRACE: basic_publish
< (60, 40): Channel.basic_publish
TRACE: ping
< (40, 10): Channel.exchange_declare
 > (20, 40): Channel.close
< (20, 41): Channel.close_ok
Closed channel #1
Traceback (most recent call last):
   File "bin/foo.py", line 34, in <module>
   File "bin/foo.py", line 8, in ping_channel
     channel.exchange_declare("RANDOMTEXT",type='topic', passive=True)
   File "/opt/local/lib/python2.5/site-packages/amqplib/ 
client_0_8.py", line 1814, in exchange_declare
     (40, 11),    # Channel.exchange_declare_ok
   File "/opt/local/lib/python2.5/site-packages/amqplib/ 
client_0_8.py", line 203, in wait
     return self._dispatch(method_sig, args, content)
   File "/opt/local/lib/python2.5/site-packages/amqplib/ 
client_0_8.py", line 115, in _dispatch
     return amqp_method(self, args)
   File "/opt/local/lib/python2.5/site-packages/amqplib/ 
client_0_8.py", line 1244, in _close
     raise AMQPChannelException(reply_code, reply_text, (class_id,  
amqplib.client_0_8.AMQPChannelException: (404, u"NOT_FOUND - no  
exchange 'bogus' in vhost '/'", (60, 40), 'Channel.basic_publish')

More information about the rabbitmq-discuss mailing list