스케쥴러에의해 특정 액터용 메시지가 반복발생 시킬수 있는
트리거 장치를 알아보겠습니다.
기본 액터 스케줄러
ActorSystem .Scheduler .ScheduleTellRepeatedly( TimeSpan.FromMinutes(30), //30분뒤 부터 작동게시 TimeSpan.FromHours(12), //12시마다 Full 인덱싱 indexActor, new ActorCmd() { CmdType = ActorCmdType.FullIndexing }, ActorRefs.NoSender );
참고 URL : https://getakka.net/articles/utilities/scheduler.html
기본 액터 스케줄러입니다. 단순하게 짧은주기 반복으로 사용하기엔 무리가 없지만
Cron과같이 조금더 디테일하고 , 복잡하고 롱텀주기의 스케쥴 주기를 관리하기에 부족해보입니다.
Quartz.NET 소개
JAVA진영의 Spring Boot Schedule에 대응하는 닷넷용 스케쥴러입니다.
Persitence,Cluster등이 지원되며
Quartz만으로 스케쥴에 해당하는 트리거를 발생시키고 활용하기에 부족함 없어보입니다.
링크:https://www.quartz-scheduler.net/documentation/
Quartz.Actor
Akka.Quartz.Actor 모듈은 Quartz.net의 스케쥴기능을 활용해 , 액터에 특정 스케줄마다 메시지를 발송할수 있게하는 모듈입니다.
Quartz의 트리거기능을 활용하면서 , Job은 액터에게 메시지 보내 실행됩니다.(이벤트 드리븐)
스케줄러 + 액터패턴으로 잡을 관리할시 유용할수 있습니다.
QuartzActor샘플
스케줄러액터(quartzActor) 에 지정된 잡에의해 , 주기적으로 작업자(Receiver)에게 메시지 전송이 가능합니다.
PM>Install-Package Akka.Quartz.Actor class Receiver: ActorBase { public Receiver() { } protected override bool Receive(object message) { //handle scheduled message here } } var receiver = Sys.ActorOf(Props.Create(() => new Receiver()), "Receiver"); var quartzActor = Sys.ActorOf(Props.Create(() => new QuartzActor()), "QuartzActor"); quartzActor.Tell(new CreateJob(receiver, "Hello", TriggerBuilder.Create().WithCronSchedule( " * * * * * ?").Build())));
스케줄러를 액터와 연동할때 이점
- 비동기적으로 명령이 전송되기 때문에, 작업 스케쥴러 명령실행을 보장합니다.
- 하나의 액터는 순차적으로 처리되기 때문에 , 배치잡이 중복으로 실행되지 않습니다.
- 복수개의 동시 잡이 필요하거나, 리모트로 작동이 필요할시 라우터액터 혹은 리모트액터로 명령 전송을 할수 있습니다. ( 코드변경없이 대상 액터변경)
지연시작이 필요할때
업데이트로 인해 어플리케이션이 첫 구동되는동안은 많은 준비를 하고 있으며 , 준비되지 않은 상태에서 스케쥴이 돌게되면
실패날 확률이 있을수 있습니다. 이경우 트리거 명령을 최초 넣는거 자체를 StartAt을 통해 지연시킬수 있습니다.
quartzActor.Tell(new CreateJob(indexActor, cmdUpdate_Index, TriggerBuilder.Create() .StartAt(new DateTimeOffset(DateTime.Now).AddMinutes(1)) .WithCronSchedule(" * * * * * ?").Build()));
링크: https://github.com/akkadotnet/Akka.Quartz.Actor