我写了服务器 - 客户端应用程序
服务器端
服务器将在直接交换时使用路由密钥 key1 初始化队列 queue1 。
在初始化和声明之后,只要有人在其上写字就会消耗数据。
客户端
客户端将使用路由键 key1 在该交换机上发布一些数据 在发布之前,我还将mandotory标志设置为true。
问题
当我首先启动服务器时,一切都很好。但是当我首先启动客户端并使用路由密钥发布数据时,我遇到了问题。当客户发布数据时,经纪人不会例外。 要求
当我在非现有队列上发布数据时,我想要异常或错误。
答案 0 :(得分:2)
如果您要将mandatory
标志设置为true
的消息发布,那么该消息将返回,以防它无法路由到任何队列。
对于不存在的交易所,禁止向不存在的交易所发布消息,因此您必须收到有关该消息的错误,例如NOT_FOUND - no exchange 'nonexistent_exchange' in vhost '/'
。
您可以声明交换队列并在客户端根据需要绑定它们。这些操作是幂等的。
请注意,在每次发布时创建和绑定交换和队列可能会对性能产生负面影响,因此请在客户端启动时执行,而不是每次发布。
P.S。:如果您使用rabbitmq-c
,那么值得引用basic_publish
documentation
请注意,在AMQ协议级别,basic.publish是一种异步方法:
这意味着代理上发生的错误条件(例如发布到不存在的交换)将不会反映在此函数的返回值中。
答案 1 :(得分:2)
我花了很多时间去做那件事。我在python中使用pika lib有一个示例代码,用于显示如何使用传递模式发送消息以防止在向非现有队列发送消息时等待响应(代理将忽略meessage以便不需要接收响应消息)
import pika
# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection()
# Open the channel
channel = connection.channel()
# Declare the queue
channel.queue_declare(queue="test", durable=True, exclusive=False, auto_delete=False)
# Enabled delivery confirmations
channel.confirm_delivery()
# Send a message
if channel.basic_publish(exchange='test',
routing_key='test',
body='Hello World!',
properties=pika.BasicProperties(content_type='text/plain',
delivery_mode=1),
mandatory=True):
print('Message was published')
else:
print('Message was returned')
参考: http://pika.readthedocs.org/en/latest/examples/blocking_publish_mandatory.html