MassTransit получает ответ от потребителя

Привет, никто не знает, как решить следующую проблему в MassTransit: Потребитель получает запрос и ответ на него, но ответ не возвращается в client.Request. метод. Я создал проект в ASP NET WEB API, и я реализовал связь запроса / ответа через интерфейс IRequestClient:

public class RequestResponseCommandProvider<TRequest, TResponse>
    : IRequestResponseCommandProvider<TRequest, TResponse>
    where TRequest : class, ICommandQueueName
    where TResponse : class
{
    private readonly IBusControl _bus;
    private readonly string _hostUri;
    public RequestResponseCommandProvider(IBusControl bus,
        string hostUri)
    {
        _bus = bus;
        _hostUri = hostUri;
    }

    public TResponse RequestResponseCommand(TRequest command)
    {
        _bus.Start();
        var serviceAddress = new Uri(_hostUri + command.QueueName);
        IRequestClient<TRequest, TResponse> client =
            _bus.CreateRequestClient<TRequest, TResponse>(serviceAddress, TimeSpan.FromSeconds(10));
        return client.Request(command).Result; //there should back response
    }
}

Я создал конфигурацию serviceBus как модуль в Autofac:

public class BusModule : Autofac.Module
{
    private readonly string _hostUri;
    IEnumerable<IConfigurableConsumer> _consumers;

    public BusModule(string hostUri, IEnumerable<IConfigurableConsumer> consumers)
    {
        _hostUri = hostUri;
        _consumers = consumers;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies());

        builder.Register(r => Bus.Factory.CreateUsingRabbitMq(sfc =>
        {
            var host = sfc.Host(new Uri(_hostUri), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });

            if (_consumers != null)
            {
                foreach (var consumer in _consumers)
                {
                    consumer.Configure(sfc);
                }
            }
        }))
        .As<IBus>()
        .As<IBusControl>()
        .SingleInstance();

        builder.RegisterType<RecieveObserver>()
            .As<IReceiveObserver>();
    }
}

Потребители добавляются конструктором. Провайдер введен в эксплуатацию:

public class TestLayer : ITestLayer
{
    private readonly IRequestResponseCommandProvider<IAddTestCommand, ResponseCommand> _provider;
    public TestLayer(
        IRequestResponseCommandProvider<IAddTestCommand, ResponseCommand> provider)
    {
        _provider = provider;
    }
    public ServiceResult CreateTest(TestRecord record)
    {
        ServiceResult result;
        try
        {
            var tmp = _provider.RequestResponseCommand(new AddTestCommand() { Record = "d3d32" });
            result = new ServiceResult();
        }
        catch (Exception ex)
        {
            result = new ServiceResult();
            result.AddError($"Wystąpił problem podczas zapisu do bazy danych: {ex}");
        }

        return result;
    }
}

Когда я проверяю очереди в RabbitMQ, все сообщения выглядят так: RabbitMQ queue

Я уже видел Sample-RequestResponse, сделанный Крисом Паттерсоном, но у меня проблема, когда я использую инъекцию зависимостей. Я буду благодарен за помощь в том, что я сделал не так. На GitHub также есть весь репозиторий, где вы можете найти простой проект, в который включен этот код, но он все еще не работает: Мой GitHub


person user3765649    schedule 18.09.2016    source источник


Ответы (1)


Две проблемы:

  1. Ленивое создание экземпляра шины - не лучшая идея, поскольку это занимает довольно много времени, и в вашем случае вы получите длительный тайм-аут, когда IBus будет разрешен в первый раз.
  2. Вы не получаете никакого ответа, потому что вам нужно запустить автобус, чтобы он вообще что-нибудь получил. Если не заводишь автобус, можно только отправить.
person Alexey Zimarev    schedule 08.09.2017
comment
Действительно, нам нужно запустить автобус, чтобы получить ответ - person phuongnd; 30.06.2018