3

我已经编写了服务器-客户端应用程序。
服务器端服务器将在直接交换中使用路由密钥key1
初始化队列queue1 。 在初始化和声明之后,只要有人在上面写,它就会消耗数据。

客户端

客户端将使用路由密钥key1在该交换上发布一些数据。
此外,在我发布之前,我已将 mandotory 标志设置为 true。

问题

当我首先启动服务器时一切都很好。但是当我首先启动客户端并使用路由密钥发布数据时出现问题。当客户端发布数据时,经纪人也不例外。


我在不存在的队列上发布数据时,我想要异常或错误。

4

2 回答 2

4

如果您将发布带有mandatory标志设置的true消息,那么该消息将返回,以防它无法路由到任何队列。

至于不存在的交易所,禁止向不存在的交易所发布消息,所以你必须得到一个错误,比如NOT_FOUND - no exchange 'nonexistent_exchange' in vhost '/'.

您也可以根据需要在客户端声明交换队列并绑定它们。这些操作是幂等的。

请注意,在每次发布时创建和绑定交换和队列可能会对性能产生负面影响,因此在客户端启动时这样做,而不是每次发布时这样做。

PS:如果您使用rabbitmq-c,那么值得引用basic_publish文档

请注意,在 AMQ 协议级别 basic.publish 是一个异步方法:

这意味着代理上发生的错误情况(例如发布到不存在的交易所)将不会反映在此函数的返回值中。

于 2015-10-01T09:23:21.663 回答
2

我花了很多时间来寻找这样做。我在 python 中有一个示例代码,使用 pika lib 来展示如何使用传递模式发送消息,以防止在将消息发送到不存在的队列时等待响应(代理将忽略消息,因此不需要接收响应消息)

    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

于 2016-03-12T10:15:27.570 回答