123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- program RunScheduledtask;
- {$APPTYPE CONSOLE}
- {$R *.res}
- uses
- SysUtils,
- DateUtils,
- Quick.Commons,
- Quick.Console,
- Quick.Threads;
- type
- TMyJob = class
- private
- fId : Integer;
- fName : string;
- public
- destructor Destroy; override;
- property Id : Integer read fId write fId;
- property Name : string read fName write fName;
- procedure DoJob;
- end;
- var
- scheduledtasks : TScheduledTasks;
- myjob : TMyJob;
- ScheduledDate : TDateTime;
- ExpirationDate : TDateTime;
- { TMyTask }
- destructor TMyJob.Destroy;
- begin
- inherited;
- end;
- procedure TMyJob.DoJob;
- var
- a, b, i : Integer;
- begin
- cout('[%s] task "%s" doing job...',[DateTimeToStr(Now()),fName],etInfo);
- //Sleep(Random(1000));
- a := Random(100);
- b := Random(5);// + 1;
- i := a div b;
- cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
- end;
- begin
- ReportMemoryLeaksOnShutdown := True;
- Console.LogVerbose := LOG_DEBUG;
- try
- scheduledtasks := TScheduledTasks.Create;
- scheduledtasks.RemoveTaskAfterExpiration := True;
- scheduledtasks.FaultPolicy.MaxRetries := 5;
- myjob := TMyJob.Create;
- myjob.Id := 1;
- myjob.Name := 'Run now and repeat every 1 second for 30 times';
- scheduledtasks.AddTask('Task1',[myjob,1],True,
- procedure(task : ITask)
- begin
- cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
- TMyJob(task.Param[0]).DoJob;
- end
- ).WaitAndRetry(10,100
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
- end
- ).OnRetry(
- procedure(task : ITask; aException : Exception; var vStopRetries : Boolean)
- begin
- if not aException.Message.Contains('Division by zero') then vStopRetries := True
- else cout('task "%s" retried %d/%d (%s)',[TMyJob(task.Param[0]).Name,task.NumRetries,task.MaxRetries,aException.Message],etWarning);
- end
- ).OnTerminated(
- procedure(task : ITask)
- begin
- cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
- end
- ).OnExpired(
- procedure(task : ITask)
- begin
- cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
- end
- ).RepeatEvery(1,TTimeMeasure.tmSeconds,30);
- myjob := TMyJob.Create;
- myjob.Id := 2;
- myjob.Name := 'Run now, repeat every 1 second forever';
- scheduledtasks.AddTask('Task2',[myjob,32,true,3.2,myjob.ClassType],True,
- procedure(task : ITask)
- begin
- cout('task "%s" started with params(Int=%d / Bool=%s / Float=%s /Class=%s)',[TMyJob(task.Param[0]).Name,task.Param[1].AsInteger,task.Param[2].AsString,task.Param[3].AsString,task.Param[4].AsString],etDebug);
- TMyJob(task.Param[0]).DoJob;
- end
- ).WaitAndRetry(10,100
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
- end
- ).OnTerminated(
- procedure(task : ITask)
- begin
- cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
- end
- ).OnExpired(
- procedure(task : ITask)
- begin
- cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
- end
- ).StartAt(Now()
- ).RepeatEvery(1,TTimeMeasure.tmSeconds);
- ScheduledDate := IncSecond(Now(),5);
- ExpirationDate := IncSecond(ScheduledDate,10);
- myjob := TMyJob.Create;
- myjob.Id := 3;
- myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
- scheduledtasks.AddTask('Task3',[myjob],True,
- procedure(task : ITask)
- begin
- cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
- TMyJob(task.Param[0]).DoJob;
- end
- ).WaitAndRetry(10,100
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
- end
- ).OnTerminated(
- procedure(task : ITask)
- begin
- cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
- end
- ).OnExpired(
- procedure(task : ITask)
- begin
- cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
- end
- ).StartAt(ScheduledDate
- ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
- ScheduledDate := IncSecond(Now(),30);
- myjob := TMyJob.Create;
- myjob.Id := 4;
- myjob.Name := Format('Run at %s and repeat only one time',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
- scheduledtasks.AddTask('Task4',[myjob],True,
- procedure(task : ITask)
- begin
- cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
- TMyJob(task.Param[0]).DoJob;
- end
- ).WaitAndRetry(10,100
- ).OnException(
- procedure(task : ITask; aException : Exception)
- begin
- cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
- end
- ).OnTerminated(
- procedure(task : ITask)
- begin
- cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
- end
- ).OnExpired(
- procedure(task : ITask)
- begin
- cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
- end
- ).StartAt(ScheduledDate
- ).RunOnce;
- scheduledtasks.Start;
- cout('Running tasks in background!',etInfo);
- Readln;
- cout('Stopping task2...',etWarning);
- scheduledtasks.GetTask('Task2').Cancel;
- Readln;
- scheduledtasks.Free;
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
- end.
|