Configure o sistema de Mensageria
Aprenda
A arquitetura de mensageria do TNF baseia-se nos conceitos da especificação AMQP. Com a abrangência de cenários e o extenso detalhamento da especificação AMQP foi criado uma abstração para permitir que outros protocolos, como por exemplo o MQTT, sejam utilizados dentro do TNF de forma transparente. A abstração permite também que sejam plugados diversos provedores de mensageria.
Termo | Definição | ||||||||
---|---|---|---|---|---|---|---|---|---|
Binding | É relacionamento entre um ExchangeRouter e uma Queue. O binding de uma Queue em um Exchange Router utilizando uma routingkey, permite o roteamento de mensagens. | ||||||||
Mensagem | É um objeto serializado que é enviado para o sistema de mensageria. O TNF vincula fortemente o objeto de mensagem, tanto para sua publicação ou assinatura, afim de garantir que uma dada mensagem será manipulada. | ||||||||
Tópicos | O Tópico é uma abstração que garante que toda a mensagem que for enviada para o sistema de mensageria seja manipulada por uma classe concreta. Isso é feito através o relacionamento que o Tópico cria entre Routing Keys, Queues e Mensagens. | ||||||||
Routing Key | É uma string utilizada como chave para identificar um Bind entre ExchangeRouter e Queues. Essa identificação faz o roteamento de mensagens na infraestrutura de mensageria e TNF.
A Routing Key trabalha com os seguintes coringas:
| ||||||||
Exchange Router | É um centralizador de Filas, contendo uma ou mais filas. | ||||||||
Exchange Type | Define o comportamento de um Exchange Router, sendo:
* Not implemented yet | ||||||||
Ação | Descrição |
---|---|
Crie uma mensagem | Implemente uma classe que represente a mensagem e herde da classe Message Classe Pessoa public class PersonCreatedEvent : Message { public string Name { get; set; } public string Lastname { get; set; } public int Age { get; set; } } |
Defina o ponto de publicação | Escolha ou crie uma classe que será responsável por publicar uma ou mais mensagem. Classe Pessoa public class PersonService { (...) public void Create(Person person) => _repository.Create(person); } |
Implemente a interface IPublish<> e publique | Toda classe que publica mensagem deve implementar a interface IPublish<T> onde T é um Message. Substitua T pela mensagem que será publicada e implemente a interface. Classe Pessoa public class PersonService : IPublish<PersonCreatedEvent> { (...) public void Create(Person person) { _repository.Create(person); var message = new PersonCreatedEvent(person.Name, person.LastName, person.Age); Handle(message); } public void Handle(PersonCreatedEvent message) { // Processa alguma regra antes de publicar a mensagem message.Publish(); } } Empilhe interfaces IPublish<T> Caso a classe publique mais de uma mensagem, basta implementar uma interface para cada mensagem. Classe Pessoa public class PersonService : IPublish<PersonCreatedEvent>, IPublish<PersonUpdateddEvent> Extensão de interfaces para publicação Além da interface padrão IPublish<T>, é possível adicionar novas interfaces para serem manipuladas pelo sistema de mensageria. Para isso, acesse o Builder de configuração do módulo de mensageria e configure a interface. Registre uma nova interface no módulo .RegisterInterfacesForPublication(typeof(IMyInterface<>), typeof(IMyCustomInterface<>)) |
Ação | Descrição |
---|---|
Crie uma mensagem | Implemente uma classe que represente a mensagem recebida e herde da classe Message Classe Pessoa public class PersonCreatedEvent : Message { public string Name { get; set; } public string Lastname { get; set; } public int Age { get; set; } } |
Defina o ponto de subscrição | Escolha ou crie uma classe que será responsável por subscreber uma ou mais mensagens. Classe Pessoa public class EmployeeService { public void Create(Employee employee) => _repository.Create(employee); } |
Implemente a interface ISubscribe<T> e assine | Toda classe que subscrever uma ou mais mensagens implementa a interface ISubscribe<T> onde T é um Message. Substitua T pela mensagem que será assinada e implemente a interface. Classe Pessoa public class EmployeeService : ISubscribe<PersonCreatedEvent> { public void Create(Employee employee) { (...) _repository.Create(employee); } public void Handle(PersonCreatedEvent message) { var employee = new Employee(message.Name, message.Lastname, message.Age); Create(employee); } } Empilhe interfaces ISubscribe<T> Caso a classe publique mais de uma mensagem, basta implementar a interface para cada mensagem. Classe Employee public class EmployeeService : ISubscribe<PersonCreatedEvent>, ISubscribe<PersonUpdatedEvent> Extensão de interfaces para assinaturas Além da interface padrão ISubscribe<T>, é possível adicionar novas interfaces para serem manipuladas pelo sistema de mensageria. Registre uma nova interface no módulo .RegisterInterfacesForPublication(typeof(IMyInterface<>), typeof(IMyCustomInterface<>)) |