2
0

RunScheduledtask.dpr 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. program RunScheduledtask;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. SysUtils,
  6. DateUtils,
  7. Quick.Commons,
  8. Quick.Console,
  9. Quick.Threads;
  10. type
  11. TMyJob = class
  12. private
  13. fId : Integer;
  14. fName : string;
  15. public
  16. destructor Destroy; override;
  17. property Id : Integer read fId write fId;
  18. property Name : string read fName write fName;
  19. procedure DoJob;
  20. end;
  21. var
  22. scheduledtasks : TScheduledTasks;
  23. myjob : TMyJob;
  24. ScheduledDate : TDateTime;
  25. ExpirationDate : TDateTime;
  26. { TMyTask }
  27. destructor TMyJob.Destroy;
  28. begin
  29. inherited;
  30. end;
  31. procedure TMyJob.DoJob;
  32. var
  33. a, b, i : Integer;
  34. begin
  35. cout('[%s] task "%s" doing job...',[DateTimeToStr(Now()),fName],etInfo);
  36. //Sleep(Random(1000));
  37. a := Random(100);
  38. b := Random(5);// + 1;
  39. i := a div b;
  40. cout('task "%s" result %d / %d = %d',[fName,a,b,i],etSuccess);
  41. end;
  42. begin
  43. ReportMemoryLeaksOnShutdown := True;
  44. Console.LogVerbose := LOG_DEBUG;
  45. try
  46. scheduledtasks := TScheduledTasks.Create;
  47. scheduledtasks.RemoveTaskAfterExpiration := True;
  48. scheduledtasks.FaultPolicy.MaxRetries := 5;
  49. myjob := TMyJob.Create;
  50. myjob.Id := 1;
  51. myjob.Name := 'Run now and repeat every 1 second for 30 times';
  52. scheduledtasks.AddTask('Task1',[myjob,1],True,
  53. procedure(task : ITask)
  54. begin
  55. cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
  56. TMyJob(task.Param[0]).DoJob;
  57. end
  58. ).WaitAndRetry(10,100
  59. ).OnException(
  60. procedure(task : ITask; aException : Exception)
  61. begin
  62. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  63. end
  64. ).OnRetry(
  65. procedure(task : ITask; aException : Exception; var vStopRetries : Boolean)
  66. begin
  67. if not aException.Message.Contains('Division by zero') then vStopRetries := True
  68. else cout('task "%s" retried %d/%d (%s)',[TMyJob(task.Param[0]).Name,task.NumRetries,task.MaxRetries,aException.Message],etWarning);
  69. end
  70. ).OnTerminated(
  71. procedure(task : ITask)
  72. begin
  73. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  74. end
  75. ).OnExpired(
  76. procedure(task : ITask)
  77. begin
  78. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  79. end
  80. ).RepeatEvery(1,TTimeMeasure.tmSeconds,30);
  81. myjob := TMyJob.Create;
  82. myjob.Id := 2;
  83. myjob.Name := 'Run now, repeat every 1 second forever';
  84. scheduledtasks.AddTask('Task2',[myjob,32,true,3.2,myjob.ClassType],True,
  85. procedure(task : ITask)
  86. begin
  87. 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);
  88. TMyJob(task.Param[0]).DoJob;
  89. end
  90. ).WaitAndRetry(10,100
  91. ).OnException(
  92. procedure(task : ITask; aException : Exception)
  93. begin
  94. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  95. end
  96. ).OnTerminated(
  97. procedure(task : ITask)
  98. begin
  99. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  100. end
  101. ).OnExpired(
  102. procedure(task : ITask)
  103. begin
  104. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  105. end
  106. ).StartAt(Now()
  107. ).RepeatEvery(1,TTimeMeasure.tmSeconds);
  108. ScheduledDate := IncSecond(Now(),5);
  109. ExpirationDate := IncSecond(ScheduledDate,10);
  110. myjob := TMyJob.Create;
  111. myjob.Id := 3;
  112. myjob.Name := Format('Run at %s and repeat every 1 second until %s',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  113. scheduledtasks.AddTask('Task3',[myjob],True,
  114. procedure(task : ITask)
  115. begin
  116. cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
  117. TMyJob(task.Param[0]).DoJob;
  118. end
  119. ).WaitAndRetry(10,100
  120. ).OnException(
  121. procedure(task : ITask; aException : Exception)
  122. begin
  123. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  124. end
  125. ).OnTerminated(
  126. procedure(task : ITask)
  127. begin
  128. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  129. end
  130. ).OnExpired(
  131. procedure(task : ITask)
  132. begin
  133. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  134. end
  135. ).StartAt(ScheduledDate
  136. ).RepeatEvery(1,TTimeMeasure.tmSeconds,ExpirationDate);
  137. ScheduledDate := IncSecond(Now(),30);
  138. myjob := TMyJob.Create;
  139. myjob.Id := 4;
  140. myjob.Name := Format('Run at %s and repeat only one time',[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
  141. scheduledtasks.AddTask('Task4',[myjob],True,
  142. procedure(task : ITask)
  143. begin
  144. cout('task "%s" started',[TMyJob(task.Param[0]).Name],etDebug);
  145. TMyJob(task.Param[0]).DoJob;
  146. end
  147. ).WaitAndRetry(10,100
  148. ).OnException(
  149. procedure(task : ITask; aException : Exception)
  150. begin
  151. cout('task "%s" failed (%s)',[TMyJob(task.Param[0]).Name,aException.Message],etError);
  152. end
  153. ).OnTerminated(
  154. procedure(task : ITask)
  155. begin
  156. cout('task "%s" finished',[TMyJob(task.Param[0]).Name],etDebug);
  157. end
  158. ).OnExpired(
  159. procedure(task : ITask)
  160. begin
  161. cout('task "%s" expired',[TMyJob(task.Param[0]).Name],etWarning);
  162. end
  163. ).StartAt(ScheduledDate
  164. ).RunOnce;
  165. scheduledtasks.Start;
  166. cout('Running tasks in background!',etInfo);
  167. Readln;
  168. cout('Stopping task2...',etWarning);
  169. scheduledtasks.GetTask('Task2').Cancel;
  170. Readln;
  171. scheduledtasks.Free;
  172. except
  173. on E: Exception do
  174. Writeln(E.ClassName, ': ', E.Message);
  175. end;
  176. end.