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)?
3 Réponses :
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.
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;
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.