【问题标题】:Unable to get Topic Exchange to Work in RabbitMQ AMQP 1.0无法让主题交换在 RabbitMQ AMQP 1.0 中工作
【发布时间】:2021-11-01 17:24:33
【问题描述】:

我发现使用 RabbitMQ 和 AMQP 1.0 非常困难,特别是因为它与使用 AMQPNetLite 的主题交换有关。我无法使用主题交换向特定队列发送消息。我什至没有使用通配符。

我的情况也超级简单。我有一个话题交流。我有一个主题交换发送到的队列。当我发送到主题交换时,队列永远不会收到消息。

test.exchange:
  bind: testqueue - routing key: test

testqueue:
  bound to exchange with routing key: test

AMQP 1.0 文档说“主题”是路由键,对吗?好吧,当我使用 AMQPNetLite 发送到 RabbitMQ 时,它似乎已连接,并且主题似乎已收到消息,但它从未路由到队列。

这是完整的代码:

            var rabbitMqAddress = $"amqp://127.0.0.1:5672";
            var address = new Address(rabbitMqAddress);
            var producerName = $"Producer-test.topic-{Time.GetTimeStamp()}";

            var connection = new Connection(address, null, new Open
            {
                ContainerId = Guid.NewGuid().ToString(),
                ChannelMax = 64,
            }, null);

            var session = new Session(connection);
            var senderLink = new SenderLink(session, producerName, "/topic/test.exchange");

            senderLink.Send(new Message
            {
                BodySection = new AmqpValue { Value = "test 123" },
                Properties = new Properties
                {
                    Subject = "test",
                }
            });

图片证明了绑定。我有什么遗漏吗?

【问题讨论】:

    标签: c# amqp amqpnetlite


    【解决方案1】:

    我认为你混合了两种方法。 您发布到地址“/topic/test” - 其中 test 是您的路由键 或者 您发布到“/exchange/test.exchange”并将 Subject-property 设置为“test”。

    两者都有效。如果您在地址中使用“/topic/”前缀,您将通过默认的“amq.topic”-exchange 而不是您自己的“test-exchange”。

    有意义吗? “路由和寻址”部分的更多信息:https://github.com/rabbitmq/rabbitmq-amqp1.0

    【讨论】:

    • 谢谢。我不得不离开这个并喘口气。我将此添加到测试套件中,并且成功了。有时我不得不退后一步让它坐下。在这种情况下,配置细节不在我的考虑范围之内,但程序化的实现却是。由于技术堆栈,我们有一个支持 1.0 的基础库,但是我们希望对 RabbitMQ 使用相同的库(因此我们不会重复代码)。作为故障保险,RabbitMQ 客户端在较低级别是可配置的,允许我们切换到任何一个。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多