2
votes

Impossible d'utiliser Bind et ConfigureConsumer ensemble

J'utilise le combo MassTransit + RabbitMQ dans l'application Asp.Net Core. La partie de configuration pertinente ci-dessous:

public IBusControl CreateBus(IServiceProvider serviceProvider)
{
    var options = serviceProvider.GetService<IConfiguration>().GetOptions<RabbitMqOptions>("rabbitmq");

    return Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        cfg.Host($"rabbitmq://{options.Host}:{options.Port}");
        cfg.ReceiveEndpoint("ingest-products", ep =>
        {
            ep.PrefetchCount = 16;

            ep.UseMessageRetry(r => r.Interval(2, 1000));
            ep.Bind<CreateProducts>(x =>
            {
                x.RoutingKey = "marketplace";
                x.ExchangeType = ExchangeType.Direct;
                x.AutoDelete = false;
                x.Durable = true;
            });

            ep.ConfigureConsumer<CreateProductsConsumer>(serviceProvider);
        });
    });
}

Lorsque j'exécute l'application, j'obtiens cette exception:

ArgumentException: les paramètres d'entité MassTransit.RabbitMqTransport.Topology.Entities.ExchangeEntity ne correspondaient pas à l'entité existante

Qu'est-ce que je fais de mal ici? Ne suis-je pas censé configurer un consommateur avec IServiceProvider après avoir IServiceProvider échange à un point de terminaison de réception? Sinon, comment puis-je le configurer correctement (enfin, je veux toujours que des choses soient injectées dans mes consommateurs)?


0 commentaires

3 Réponses :


3
votes

Si vous liez les types de messages au point de terminaison de réception qui sont les mêmes que les types de message dans le consommateur, vous devez désactiver la liaison d'échange automatique.

// for MassTransit versions v6 and earlier
endpoint.BindMessageExchanges = false;

// for MassTransit versions 7 and onward
endpoint.ConfigureConsumeTopology = false;

Cela empêchera MassTransit d'essayer de lier les types de messages du consommateur sur le point de terminaison.


0 commentaires

1
votes

J'ai passé la majeure partie de ma journée à essayer de trouver ça. Dans la v7 +, il a été renommé en:

endpoint.ConfigureConsumeTopology = false;


0 commentaires

1
votes

Vous devez désactiver la liaison d'échange de messages automatique pour que votre liaison de message personnalisée fonctionne.

endpoint.ConfigureConsumeTopology = false;

En suivant le code source sur GitHub, nous pouvons voir que la méthode ConfigureConsumeTopology rend obsolète les méthodes précédentes, telles que BindMessageTopics, BindMessageExchanges , SubscribeMessageTopics.


0 commentaires