[rabbitmq-discuss] AMQPChannelException: (404, u"NOT_FOUND - no exchange '4042acd4bbec471aafc557af39ee0efe' in vhost '/'", (60, 40), 'Channel.basic_publish')

Alex Lyakas alex at zadarastorage.com
Tue Dec 18 08:54:49 GMT 2012


Greetings all,

I am using rabbitmq server + kombu + pyamqplib on a stock Ubuntu-Precise. 
Below are the versions of the components:
rabbitmq-server 2.7.1-0ubuntu4
python-amqplib  1.0.0+ds-1
python-kombu 1.4.3-1

The issue I am seeing is the “no exchange” exception, which I hit when 
opening a new channel on an existing connection. Here is a typical crash 
stack:
TRACE: File "/usr/lib/python2.7/dist-packages/kombu/connection.py", line 
159, in channel
TRACE: chan = self.transport.create_channel(self.connection)
TRACE: File "/usr/lib/python2.7/dist-packages/kombu/transport/pyamqplib.py", 
line 235, in create_channel
TRACE: return connection.channel()
TRACE: File "/usr/lib/python2.7/dist-packages/kombu/transport/pyamqplib.py", 
line 144, in channel
TRACE: return Channel(self, channel_id)
TRACE: File "/usr/lib/python2.7/dist-packages/kombu/transport/pyamqplib.py", 
line 183, in init
TRACE: super(Channel, self).__init__(*args, **kwargs)
TRACE: File 
"/usr/lib/python2.7/dist-packages/amqplib/client_0_8/channel.py", line 82, 
in init
TRACE: self._x_open()
TRACE: File 
"/usr/lib/python2.7/dist-packages/amqplib/client_0_8/channel.py", line 471, 
in _x_open
TRACE: (20, 11), # Channel.open_ok
TRACE: File 
"/usr/lib/python2.7/dist-packages/amqplib/client_0_8/abstract_channel.py", 
line 97, in wait
TRACE: return self.dispatch_method(method_sig, args, content)
TRACE: File 
"/usr/lib/python2.7/dist-packages/amqplib/client_0_8/abstract_channel.py", 
line 115, in dispatch_method
TRACE: return amqp_method(self, args)
TRACE: File 
"/usr/lib/python2.7/dist-packages/amqplib/client_0_8/channel.py", line 273, 
in _close
TRACE: (class_id, method_id))
TRACE: AMQPChannelException: (404, u"NOT_FOUND - no exchange 
'4042acd4bbec471aafc557af39ee0efe' in vhost '/'", (60, 40), 
'Channel.basic_publish')

I hit this only with direct exchanges, with “auto-delete” = True.

The flow that I have is like follows:
- node A declares a direct exchange and declares a queue
- node A sends message to node B using a topic exchange, and embeds direct 
exchange name in the message
- node B parses the message, prepares the reply, declares the (same) direct 
exchange and a producer
- node B sends reply message on the producer
- node A and node B close their channels
- several seconds after that, when node B tries to create a new channel on 
the same connection (using the same channel_id), it hits this exception.

I am trying to debug this for some time, but do not have a clear way to 
repro this. It happens occasionally.

I understand, that since I open the channel with the same channel_id, I may 
receive some stale message from the server (for the same channel_id) 
regarding failure to publish. However, several things confuse me:

1) The only code, which publishes to a direct exchange is as follows:
self.exchange = kombu.entity.Exchange(name=self.exchange_name, 
**self.kwargs)
self.producer = kombu.messaging.Producer(exchange=self.exchange, 
channel=channel, routing_key=self.routing_key)
self.producer.publish(msg)
How can exchange not being present here?

2) Even though all exchanges have auto-delete=True, I see more than 3000 
existing direct exchanges on the rabbitmqctl list_exchanges output. The 
queues that used these exchanges (also auto-delete=True) do not exist 
anymore.
When auto-delete=True exchanges are deleted? Is there some timeout on their 
deletion? The documentation says that there SHOULD be a reasonable timeout. 
What is this timeout? Can it be configured? Is exchange auto-deletion 
supposed to work in my version?

3) The exchanges that I receive exceptions about do not exist indeed. How 
can I debug the rabbitmq server and understand why it decides to delete some 
exchanges, but not the other ones?

Thanks,
Alex.



More information about the rabbitmq-discuss mailing list