Apache QPID Broker队列为什么声明参数“ x-qpid-dlq-enabled”无法正常工作?

问题描述 投票:0回答:1

我正在尝试将Apache QPID Broker(版本7.1.6)作为嵌入式运行在内存代理中,并在该队列中将队列声明选项x-qpid-dlq-enabled设置为“ true”来声明一个队列。


public void createQueues() throws Exception {

    //connect to embedded broker running on local host
    ConnectionFactory factory = createConnectionFactory();
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    Map<String, Object> args = new HashMap<>();
    args.put("x-qpid-dlq-enabled",true);
    channel.queueDeclare("Test Queue", true, false, false, args);

根据在此处找到参数“ x-qpid-dlq-enabled”的条目:https://qpid.apache.org/releases/qpid-broker-j-7.1.0/book/Java-Broker-Appendix-Queue-Declare-Arguments.html

并且根据第9.4.3节中描述的行为:https://qpid.apache.org/releases/qpid-java-6.1.0/java-broker/book/Java-Broker-Runtime-Handling-Undeliverable-Messages.html

预期的行为是,如果使用该选项,则会自动创建一个死信交换和一个死信队列。从上面的第二个链接:

“ DLQ功能导致生成死信交换和死信队列。它们被命名为约定QueueName_DLE和QueueName_DLQ。

可以在创建新队列或使用队列声明属性x-qpid-dlq-enabled时启用DLQ。“

但是,当我尝试使用该声明参数声明队列时,收到以下错误。


    Exception in thread "main" java.io.IOException
        at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:129)
        at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125)
        at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147)
        at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:968)
        at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.queueDeclare(AutorecoveringChannel.java:333)
        at BrokerConnector.createQueues(BrokerConnector.java:43)
        at Main.main(Main.java:11)
    Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(reply-code=404, reply-text=Unknown alternate exchange: 'Test Queue_DLQ', class-id=50, method-id=10)
        at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)

我正在使用RabbitMQ客户端创建到QPID代理的AMQPConnection,并且客户端和代理都在使用AMQ协议v 0_8。为什么没有按QPID文档中的说明自动创建适当的交换,以及为什么交换名称后缀为“ _DLQ”而不是文档中也指定为“ _DLE”。我了解该行为已在Java版本6的Qpid中进行了记录,并且我正在运行7.1.6,但是更高版本的文档中没有发行说明表明该行为应该有所不同,而版本7.1.6的文档仍然指出了"x-qpid-dlq-enable"参数支持。

有任何建议或想法吗?

apache amqp qpid dead-letter
1个回答
0
投票

配置死信队列的方式在Qpid Broker J的7.0版中已更改。不幸的是,看起来好像v6机制中遗留了一些代码(和文档),这导致了您看到的错误。

从版本7开始,您可以直接在队列上设置DLQ(或更正确地说是替代绑定),而无需进行替代交换。

如果您希望自动进行此操作,则[email protected]邮件列表上的以下邮件交换可能很有用:http://qpid.2158936.n2.nabble.com/Qpid-Broker-J-configure-alternate-binding-in-Node-auto-creation-policy-tp7684426.html

在此为我先前的猜测(而且是完全错误的)表示歉意,我承认部分代码不是我经常看的东西。

© www.soinside.com 2019 - 2024. All rights reserved.