Planowanie zadań, nServiceBus–część VI

Dzisiaj o zadaniu, które jest powszechne dla systemów rozproszonych, zwłaszcza tych opartych o kolejki. Załóżmy, że chcemy wysyłać emaile co 24h.  Najpierw definiujemy wiadomość:

public class SendEmail : IMessage
{
   public string Email { get; set; }
}

Kolejnym krokiem jest implementacja handlera:

public class SendEmailHandler : IHandleMessages<SendEmail>
{
   public void Handle(SendEmail message)
   {
       Console.WriteLine("{0}:{1}", DateTime.Now.ToLongTimeString(), message.Email);
   }
}

Jeśli chcemy co 5 sekund umieszczać powyższą wiadomość na kolejce, to możemy:

_schedule.Every(TimeSpan.FromSeconds(10), () => _bus.SendLocal(new SendEmail { Email = Guid.NewGuid().ToString() }));

Zmienna _schedule to instancja klasy Schedule. Najlepszym momentem na wywołanie tego jest prawdopodobnie start aplikacji:

public class ScheduleMyTasks : IWantToRunWhenBusStartsAndStops
{
   private readonly IBus _bus;
   private readonly Schedule _schedule;

   public ScheduleMyTasks(IBus bus, Schedule schedule)
   {
       _bus = bus;
       _schedule = schedule;
   }

   public void Start()
   {
       _schedule.Every(TimeSpan.FromSeconds(10), () => _bus.SendLocal(new SendEmail()));
   }

   public void Stop()
   {
   }
}

Implementując interfejs IWantToRunWhenBusStartsAndStops możemy wykonać własny kod w momencie startu nServiceBus. Nic  więcej nie musimy konfigurować – klasa sama zostanie znaleziona przez framework.

Należy mieć na uwadze, że scheduler umieści wiadomość w kolejce co określony czas, ale nie jest to jednoznaczne z wykonaniem kodu. Jeśli sporo wiadomości czeka na handler’a to oczywiście może to opóźnić się.

Tak jak to w przypadku wszystkich wiadomości, gdy obsługa zakończy się wyjątkiem, wtedy zostanie ona powtórzona kilkakrotnie (pisałem w poprzednich postach o mechanizmie wznowień). Uruchamiając przykład zobaczymy zatem:

image

Leave a Reply

Your email address will not be published.