Как настроить MassTransit так, чтобы команды в очереди ждали потребителей? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть вопрос о конфигурации MassTransit. Есть основное приложение и микросервис. Например, основное приложение отправляет микросервису (потребителю) команды на списание средств со счета.

Конфигурация в основном приложении:

var rabbitHost = new Uri("rabbitmq://localhost/app");
services.AddMassTransit(x => {
  x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg => {
    var host = cfg.Host(rabbitHost, hostConfigurator => {
      hostConfigurator.Username("user");
      hostConfigurator.Password("password");
    });
  }));
});
EndpointConvention.Map<WithdrawFunds>(new Uri(rabbitHost + "/test-queue"));

Конфигурация микросервиса:

var rabbitHost = new Uri("rabbitmq://localhost/app");
services.AddMassTransit(x => {
  x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg => {
    var host = cfg.Host(rabbitHost, hostConfigurator => {
      hostConfigurator.Username("username");
      hostConfigurator.Password("password");
    });
    cfg.ReceiveEndpoint(host, "test-queue", ep => {
      ep.Consumer<WithdrawFundsConsumer>();
    });
  }));
});

Команда, выполняемая в главном приложении, например:

await _sendEndpointProvider.Send<WithdrawFunds>(new {
  Amount = 100,
  AccountId = "someId"
});

MassTransit создает очередь "test-queue", и если оба приложения работают, взаимодействие успешно выполняется. Но если я остановлю микросервис, то создается очередь «test-queue_skipped», в которую попадают пропущенные сообщения. Однако, если я запусту микросервис, он не будет получать пропущенные сообщения.

Как настроить MassTransit так, чтобы "_skipped" не создавался, а сообщения ожидали появления потребителя?

...