【问题标题】:Confused by Masstransit ReceiveFrom method and consumer behaviour对 Masstransit ReceiveFrom 方法和消费者行为感到困惑
【发布时间】:2018-03-29 15:14:07
【问题描述】:

我想用 RabbitMq 创建一个队列,在其中我将在一侧发送一些消息并在另一个应用程序中接收。我正在使用以下代码:

return ServiceBusFactory.New(x =>
        {
            var uriString = string.Format(@"rabbitmq://{0}/{1}/{2}?prefetch={3}", host, virtualHost, queueName,
                prefetch < 1 ? 1 : prefetch);
            x.UseRabbitMq(r => r.ConfigureHost(new MessageUrn(uriString), h =>
            {
                h.SetUsername(user);
                h.SetPassword(password);
                h.SetRequestedHeartbeat(3);

            }));

            x.ReceiveFrom(uriString);

            x.UseJsonSerializer<ServiceBusConfigurator>();

            f(x);
        });

MessageUrn uri 和 ReceiveFrom 应该具有相同的 uri,否则为 ReceiveFrom 方法指定的 uri 确定总线端点。但这意味着我的发布者也是同一队列的消费者。当没有接收者时,所有消息都进入 queuename_error 队列。当有接收器时,一切似乎都正常。

我做错了什么?我理解为什么消息会进入错误队列——因为发布者没有订阅它们,但同时他是消费者,因此 发生错误情况。当接收器(重新)启动时,是否可以从错误队列中恢复消息?

masstransit 是 2.10.0.0。

提前致谢。

【问题讨论】:

  • 我建议您将masstransit 升级到masstransit-project.com/MassTransit
  • 我不能使用更高版本。

标签: .net rabbitmq message-queue masstransit


【解决方案1】:

.ReceiveFrom() 地址对于每个服务应该是唯一的,并且仅当服务具有相同的消费者并使用相同的消息类型时才共享。使用同一个 RabbitMQ 服务器的服务之间唯一的共同点是主机(和虚拟主机,如果使用的话)。否则,它们一定是不同的。

是的,它们会进入错误队列,因为发布者没有订阅它们。给您的发布者一个不同的队列名称,问题就解决了。

【讨论】:

  • 感谢您的回复。我仍然无法得到它 - 如果我只想发送消息,为什么要指定 ReceiveFrom() ?为什么 ConfigureHost 方法中的 uri 不够用?此外,当我指定不同的 uri 字符串(一个用于 ConfigureHost,一个用于 ReceiveFrom)时,消息将被发送到 ReceiveFrom 方法指定的队列。很奇怪……
  • 它是 v2 API 时代和演变的产物。 V3 api 更有意义,但你说你不能升级,所以,你被它困住了。
  • 如果 v3 可以帮助避免这种情况,我会尝试迁移。我认为它是特定于 RMQ 的。
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2017-03-20
  • 2013-07-19
相关资源
最近更新 更多