MassTransit ACCESS_REFUSED на обмене, не указанном в коде

Я использую очень простой пример для тестирования подключения MassTransit к rabbitMq через C#. Всякий раз, когда я запускаю этот код для подключения к моей конечной точке rabbitMq, он отлично работает, когда у меня есть подстановочный знак, установленный в качестве разрешения. Однако, когда я добавлю разрешения в администраторе rabbitMq, чтобы разрешить этому пользователю доступ только к событию test, этот код завершится ошибкой.

По какой-то причине он сначала попытается подключиться к имени биржи, которое, я думаю, сгенерировано (MassTransit?):

RabbitMQ.Client.Exceptions.OperationInterruptedException: 'The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=403, text="ACCESS_REFUSED - access to exchange '*ComputerName*_dotnet_bus_73451gfsgerqwrefxfddgf' in vhost '/' refused for user 'user'", classId=40, methodId=10, cause='

Итак, биржа *ComputerName*_dotnet_bus_73451gfsgerqwrefxfddgf, после этого попытается подключиться к бирже test. Конечно, я могу добавить обмен ComputerName.... к разрешениям, но тогда это нужно будет сделать для каждого компьютера, пытающегося запустить этот код. Почему MassTransit пытается подключиться к этой бирже? Это неправильный код или просто так работает MassTransit?

Это код для тестового приложения (я немного изменил его, чтобы он мог работать не сразу, но в целом код работает нормально):

using System;
using MassTransit;

namespace Test
{
    public class Testing
    {
        public string Id { get; set; }
    }
}

namespace Consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
            {
                var host = sbc.Host(new Uri("rabbitmq://servername"), h =>
                {
                    h.Username("user");
                    h.Password("user");
                });

                sbc.ReceiveEndpoint(host, "test", ep =>
                {
                    ep.Handler<Testing>(context =>
                    {
                        return Console.Out.WriteLineAsync($"Received: {context.Message.Id}");
                    });
                });
            });

            bus.Start();

            // For testing purposes, we send a message ourselves.
            bus.Publish(new Testing { Id = "X" });

            Console.WriteLine("Waiting for messages. Press any key to exit");
            Console.ReadKey();

            bus.Stop();
        }
    }
}

Изображение разрешения пользователя администратора rabbitMq:

Разрешения администратора Regex rabbitmq


person inControl    schedule 09.04.2019    source источник


Ответы (1)


Это неправильный код или просто так работает MassTransit?

Скорее всего, именно так работает MassTransit. См. этот другой вопрос: Запретить MassTransit создавать обмен RabbitMQ для потребительского хоста

Как ни странно, я не смог найти эту информацию нигде в документации MassTransit.

Вам нужно будет предоставить разрешение configure для обменов, содержащих строку dotnet_bus. Скорее всего, потребуются другие разрешения, такие как read и write.


ПРИМЕЧАНИЕ. команда RabbitMQ отслеживает rabbitmq-users список рассылки и лишь иногда отвечает на вопросы в StackOverflow.

person Luke Bakken    schedule 09.04.2019
comment
Существуют и другие обмены и/или очереди, которые могут быть созданы как ошибки и возникают в работающей производственной системе. Попытка заблокировать MassTransit может привести к невозможности восстановления после сбоев, если MT не может создавать очереди ошибок и т. д. Существуют также обмены ошибками и другие вещи, которые могут быть созданы, когда происходят плохие вещи. Если они не могут быть созданы, MT зависнет и не сможет продолжить работу. - person Chris Patterson; 09.04.2019
comment
Странно то, что я просто пытаюсь подключиться к «тестовому» обмену, зачем общественному транспорту создавать два обмена? один для теста и один сгенерированный с помощью dotnet_bus? - person inControl; 10.04.2019
comment
MassTransit многое делает для вас, хорошо это или плохо. Это должен быть один из них. Я предлагаю обратиться на форумы поддержки, относящиеся к этой библиотеке. - person Luke Bakken; 10.04.2019