Derramamento com quartzo na Masstransit

Este artigo mostrará como usar o Masstransit e o Quartz para configurar um sheduler para enviar mensagens para o barramento. Um barramento é uma abstração de uma conexão fraca entre aqueles que enviam mensagens e os que os assinam através do barramento. O remetente e o destinatário das mensagens sabem apenas o tipo de mensagem (essa é a interface), mas não sabem nada um do outro.

O controle Quartz no Masstransit ocorre através de uma fila, alocamos uma fila para isso:

Startup.cs

cfg.UseInMemoryScheduler(sheduleConfig.QuartzQueue); 

Ver todo o código

No ponto de acesso ao sheduler (no meu exemplo, este é o método do controlador), obtemos o objeto ISendEndpoint para a fila especificada:

 ISendEndpoint _sendEndpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri($"rabbitmq://{configs.Host}/{configs.QuartzQueue}")); 

E enviamos uma mensagem com as configurações para o cancelamento periódico de mensagens para uma determinada fila:

 _sheduler.ScheduledRecurringMessage = await _sendEndpoint.ScheduleRecurringSend<IRepeatingCommand>( new Uri($"rabbitmq://{configs.Host}/{configs.DestinationQueue}"), new PollExternalSystemSchedule(), new { Message = $"1 sec Quartz {User.Identity.Name}" }); 

Configurações de frequência PollExternalSystemSchedule

  public class PollExternalSystemSchedule : DefaultRecurringSchedule { public PollExternalSystemSchedule() { StartTime = DateTime.UtcNow; CronExpression = "* * * * * ? *";//1 sec } } 

A linha para definir a frequência pode ser gerada aqui .

Você já pode vincular os consumidores ao barramento ao qual o sheduler enviará mensagens (aqueles que receberem a mensagem):

 cfg.ReceiveEndpoint(host, sheduleConfig.DestinationQueue, e => { e.ConfigureConsumer<ShedulerCommandConsumer>(provider); }); 

O consumidor está vinculado ao endereço (endereço da fila acima) e à interface:

  public class ShedulerCommandConsumer : IConsumer<IRepeatingCommand> { private ILogger<ShedulerCommandConsumer> _logger; public ShedulerCommandConsumer(ILogger<ShedulerCommandConsumer> loger) { _logger = loger; } public Task Consume(ConsumeContext<IRepeatingCommand> context) { _logger.LogInformation($"Call consumer: {typeof(ShedulerCommandConsumer)} {context.Message.Message} {DateTime.UtcNow} "); return Task.CompletedTask; } } 

Para parar o sheduler, ligue para:

 await _sendEndpoint.CancelScheduledRecurringSend(_sheduler.ScheduledRecurringMessage); 

Código fonte

Também posso falar sobre o trabalho da máquina de estado Saga (em um projeto real, as mensagens também podem passar por ela).

Source: https://habr.com/ru/post/pt469905/


All Articles