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.cscfg.UseInMemoryScheduler(sheduleConfig.QuartzQueue);
Ver todo o códigoNo 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 = "* * * * * ? *";
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 fonteTambém posso falar sobre o trabalho da máquina de estado Saga (em um projeto real, as mensagens também podem passar por ela).