Confira nesta sessão o passo a passo para configurar o sistema de mensageria.
Leia sobre o sistema de mensageria TNF
Antes de partir para a configuração, leia sobre o funcionando da mensageria TNF em (ADICONAR LINK)
Adicione um ou mais tópicos para serem manipulados por uma Fila.
var personUpdatedEventTopic= TopicSetup.Builder .Factory() .Message(typeof(PersonUpdatedEvent)) .AddKey("Person.Updated.Event") .AddKey("Person.Event") .Build(); var personUpdatedEventTopic= TopicSetup.Builder .Factory() .Message(typeof(custumerCreditLimitChangedEventTopic)) .AddKey("Custumer.CreditLimit.*") .Build();
Contrato
Lembre-se: O nameof de uma classe é o Contrato entre quem publica e quem assina.
Crie uma fila, defina seu comportamento e adicione os tópicos que serão manipulados.
var queue = QueueSetup.Builder .Factory() .QueueName(new Bogus.Faker().Random.AlphaNumeric(8)) .QueueReliabilitySetup(r => r .AckIsMandatory(true) .AutoDeleteQueue(true) .MaxMessageSize(256) .PersistMessage(false) .Build()) .AddTopics(personUpdatedEventTopic) .AddTopics(custumerCreditLimitChangedEventTopic) .Build();
Agora que já temos a fila e seus tópicos, é hora de configurar um ExchangerRouter para fazer bind da fila.
var exchangeRouter = ExchangeRouter .Builder .Factory() .Name("ExchangeForTesting") .ServerAddress("127.0.0.1") .Type(Tnf.App.Bus.Queue.Enums.ExchangeType.topic) .QueueChannel(QueueChannel.Amqp) .Reliability(isDurable: false, isAutoDelete: false, isPersistent: false) .AddQueue(queue) .SetExclusive(false) .Build();
Salve o Exchange Router
O Builder de ExchangeRouter possui o método Save(), para salvarC em um arquivo físico a configuração do Exchange Router.
Para evitar configurações hardcoded, crie um arquivo de configuração, faça a paremetrização e adicione a sua leitura na criação do seu ExchangeRouter.
var exchangeRouter = ExchangeRouter .Builder .Factory() .Load($@"c:\path_arquivo_configuracoa\ExchangeRouter.json") .Build();
Template do arquivo de configuração Exchange Router
Para obter um template do arquivo de configuração do Exchange Router, crie um novo ExchangeRouter via Build e substitua o método Build() por Save(), para salvar um arquivo físico com a configuração do Exchange Router.
Use o arquivo abaixo como cola para criar o seu ExchangeRouter!
{ "Guid": "a8763d12-bd4d-48b7-bc22-13d90d780cce", "QueueChannel": 0, "ServerAddress": "127.0.0.1", "ExchangeRouterName": "ExchengeRouterModel", "ExchangeType": 2, "IsExclusive": false, "Queues": [{ "Guid": "da1e07e5-4870-400c-abe8-8670a63c4884", "QueueName": "PersonCreatedEvent", "Topics": { "PersonCreatedEvent": ["Person.Created.Event"], "PersonUpdatedEvent": ["Person.Updated.Event"] }, "QueueReliabilityModel": { "PersistMessage": false, "Ack": false, "MirroredQueue": false, "MaxMessageSize": 0, "UnknowingMessage": false, "AutoDeleteQueue": false } } ], "IsAutoDelete": false, "IsDurable": true, "IsPersistent": true }
Primeiro de tudo, adicione as referências de assembly e o DependsOn(leia mais sobre Criação de Módulos e DependsOn) para os módulos de mensageria.
// Using (...) using Tnf.App.Bus.Queue; using Tnf.App.Bus.Client; using Tnf.App.Bus.Queue.RabbitMQ; using Tnf.App.Bus.Client.Configuration.Startup; using Tnf.App.Bus.Queue.Enums; (...) // DependsOn [DependsOn( (...) typeof(TnfAppBusQueueModule), typeof(TnfAppBusClientModule), (...)
Erros comuns
Importante: É comum problemas na mensageria devido a problemas de configuração de módulos, principalmente relacionados ao DependsOn
Uma vez configurado as depenências do módulos, vamos configurar o serviço de mensageria.
// typeof(TnfAppBusQueueModule), // typeof(TnfAppBusClientModule), Configuration.BusClientSetup() .SetIocManager(IocManager) .SetExchangeRouter("default", e => exchangeRouter) .AddPublishers(() => new PublisherListener(Configuration.BusClientSetup().GetExchangeRouterInstance("default"))) .AddSubscribers(() => new SubscriberListener(Configuration.BusClientSetup().GetExchangeRouterInstance("default"))) .Run();
Criando Publicadores e Assinantes
Lembre-se: Um ExchangeRouter pode fazer bind para publicadores e assinantes ao mesmo tempo.
Reduza o acoplamento e linhas de código