Надежность сообщений в MassTransit / RabbitMQ - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть 2 приложения, одно публикует событие и одно потребительское событие. При публикации используется SimpleInjector:

container.AddMassTransit(x =>
{
    x.AddBus(() => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(ConfigurationValuesProvider.Current.Get("RabbitHostName"), hostConfigurator =>
        {

        });

    }));
});

Потребитель использует CastleWindsor:

container.AddMassTransit(x =>
{
    x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(configurationProvider.RabbitHostName);

        x.AddConsumer<FactAddedHandler>();
        x.AddConsumer<FactAddedWebhookHandler>();
        x.AddConsumer<FactMonitorHandler>();

        cfg.ConfigureEndpoints(container);
    }));

});

Все работает нормально, хотя я пытался сделать некоторые из сообщений, которые я публикую sh, не Это можно сделать, введя регистрацию customer :

x.AddConsumer<FactAddedHandler>().Endpoint(e =>
{
    e.Temporary = true;
});

Таким образом, очередь будет помечена как временная и будет удалена, как только приложение выйдет из строя. Но я только хочу, чтобы сообщения были недолговечными, я хотел бы, чтобы очередь все еще работала и была готова, когда приложение закрывается. Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 13 февраля 2020

Очевидно, я не думаю, что e.Temporary = true; делает то, что, как вы думаете, будет делать.

При настройке ваших конечных точек конфигуратор, передаваемый в функцию конфигурации, является довольно общим кросс-брокером IReceiveEndpointConfigurator. Если вы хотите сконфигурировать некоторые вещи, специфичные для брокера c, вы можете привести к конфигуратору, специфичному для брокера c. Например, для RMQ:

x.AddConsumer<FactAddedHandler>().Endpoint("my_queue", e =>
{
  if (e is IRabbitMqReceiveEndpointConfigurator r)
  {
    r.Durable = false;
  }
});

Обратите внимание, что если вы не укажете имя очереди, вы все равно получите «временную очередь» MT, которая будет иметь уникальное имя и уничтожено, когда ваше приложение закрывается. Это может быть не то, что вы хотите.

...