RunScheduledTasks.lpr 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. program RunScheduledTasks;
  2. {$APPTYPE CONSOLE}
  3. {$MODE DELPHI}
  4. uses
  5. SysUtils,
  6. DateUtils,
  7. Quick.Commons,
  8. Quick.Console,
  9. Quick.Threads;
  10. type
  11. { TMyJob }
  12. TMyJob = class
  13. private
  14. fId : Integer;
  15. fName : string;
  16. public
  17. property Id : Integer read fId write fId;
  18. property Name : string read fName write fName;
  19. procedure DoJob(task : ITask);
  20. procedure Failed(task : ITask; aException : Exception);
  21. procedure Retry(task : ITask; aException : Exception; var vStopRetries : Boolean);
  22. procedure Finished(task : ITask);
  23. procedure Expired(task : ITask);
  24. end;
  25. var
  26. scheduledtasks : TScheduledTasks;
  27. myjob : TMyJob;
  28. ScheduledDate : TDateTime;
  29. ExpirationDate : TDateTime;
  30. { TMyJob }
  31. procedure TMyJob.DoJob(task : ITask);
  32. var
  33. a, b, i : Integer;
  34. begin
  35. cout('[%s] task "%s" doing a %s job %d...',[DateTimeToStr(Now()),fName,task.Param[0].AsString,task.Param[1].AsInteger],etInfo);
  36. Sleep(Random(1000));
  37. a := Random(100);
  38. b := Random(5) + 1;
  39. i := a div b;
  40. task.Result := i;
  41. cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
  42. end;
  43. procedure TMyJob.Failed(task : ITask; aException : Exception);
  44. begin
  45. cout('task "%s" failed (%s)',[fName,aException.Message],etError);
  46. end;
  47. procedure TMyJob.Retry(task: ITask; aException: Exception; var vStopRetries: Boolean);
  48. begin
  49. cout('task "%s" retrying %d/%d (%s)',[fName,task.NumRetries,task.MaxRetries,aException.Message],etWarning);
  50. end;
  51. procedure TMyJob.Finished(task : ITask);
  52. begin
  53. cout('task "%s" finished (Result = %d)',[fName,task.Result.AsInteger],etDebug);
  54. end;
  55. procedure TMyJob.Expired(task : ITask);
  56. begin
  57. cout('task "%s" expired',[fName],etWarning);
  58. end;
  59. begin
  60. Console.LogVerbose := LOG_DEBUG;
  61. try
  62. scheduledtasks := TScheduledTasks.Create;
  63. scheduledtasks.RemoveTaskAfterExpiration := True;
  64. myjob := TMyJob.Create;
  65. myjob.Id := 1;
  66. myjob.Name := 'Run now and repeat every 1 minute for 5 times';
  67. scheduledtasks.AddTask('Task1',['blue',7],True,myjob.DoJob
  68. ).WaitAndRetry(2,100
  69. ).OnRetry(myjob.Retry
  70. ).OnException(myjob.Failed
  71. ).OnTerminated(myjob.Finished
  72. ).OnExpired(myjob.Expired
  73. ).RepeatEvery(1,TTimeMeasure.tmSeconds,5);
  74. myjob := TMyJob.Create;
  75. myjob.Id := 2;
  76. myjob.Name := 'Run now and repeat every 1 second forever';
  77. scheduledtasks.AddTask('Task2',['red',14],True,myjob.DoJob
  78. ).WaitAndRetry(2,100
  79. ).OnRetry(myjob.Retry
  80. ).OnException(myjob.Failed
  81. ).OnTerminated(myjob.Finished
  82. ).OnExpired(myjob.Expired
  83. ).StartAt(Now()
  84. ).RepeatEvery(1,TTimeMeasure.tmseconds);
  85. ScheduledDate := IncSecond(Now(),5);
  86. ExpirationDate := IncSecond(ScheduledDate,10);
  87. myjob := TMyJob.Create;
  88. myjob.Id := 3;
  89. myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  90. scheduledtasks.AddTask('Task3',['white',21],True,myjob.DoJob
  91. ).WaitAndRetry(2,100
  92. ).OnRetry(myjob.Retry
  93. ).OnException(myjob.Failed
  94. ).OnTerminated(myjob.Finished
  95. ).OnExpired(myjob.Expired
  96. ).StartAt(ScheduledDate
  97. ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
  98. scheduledtasks.Start;
  99. cout('Running tasks in background!',etInfo);
  100. ConsoleWaitForEnterKey;
  101. scheduledtasks.Free;
  102. except
  103. on E: Exception do
  104. Writeln(E.ClassName, ': ', E.Message);
  105. end;
  106. end.