@@ -337,17 +337,11 @@ private function lockGroup(string $groupId, callable $callback): void
337
337
*
338
338
* @return void
339
339
* @throws Exception|Throwable
340
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
340
341
*/
341
342
protected function _runJob ($ scheduledTime , $ currentTime , $ jobConfig , $ schedule , $ groupId )
342
343
{
343
344
$ jobCode = $ schedule ->getJobCode ();
344
- $ scheduleLifetime = $ this ->getCronGroupConfigurationValue ($ groupId , self ::XML_PATH_SCHEDULE_LIFETIME );
345
- $ scheduleLifetime = $ scheduleLifetime * self ::SECONDS_IN_MINUTE ;
346
- if ($ scheduledTime < $ currentTime - $ scheduleLifetime ) {
347
- $ schedule ->setStatus (Schedule::STATUS_MISSED );
348
- // phpcs:ignore Magento2.Exceptions.DirectThrow
349
- throw new Exception (sprintf ('Cron Job %s is missed at %s ' , $ jobCode , $ schedule ->getScheduledAt ()));
350
- }
351
345
352
346
if (!isset ($ jobConfig ['instance ' ], $ jobConfig ['method ' ])) {
353
347
$ schedule ->setStatus (Schedule::STATUS_ERROR );
@@ -863,7 +857,7 @@ private function processPendingJobs(string $groupId, array $jobsRoot, int $curre
863
857
}
864
858
865
859
$ scheduledTime = strtotime ($ schedule ->getScheduledAt ());
866
- if ($ scheduledTime > $ currentTime ) {
860
+ if (! $ this -> shouldRunJob ( $ schedule , $ groupId , $ currentTime, ( int ) $ scheduledTime ) ) {
867
861
continue ;
868
862
}
869
863
@@ -980,4 +974,62 @@ private function setProcessTitle(string $jobCode, string $groupId): void
980
974
cli_set_process_title ($ this ->originalProcessTitle . " # group: $ groupId, job: $ jobCode " );
981
975
}
982
976
}
977
+
978
+ /**
979
+ * Mark job as missed
980
+ *
981
+ * @param Schedule $schedule
982
+ * @return void
983
+ */
984
+ private function markJobAsMissed (Schedule $ schedule ): void
985
+ {
986
+ $ jobCode = $ schedule ->getJobCode ();
987
+ $ scheduleId = $ schedule ->getId ();
988
+ $ resource = $ schedule ->getResource ();
989
+ $ connection = $ resource ->getConnection ();
990
+ $ message = sprintf ('Cron Job %s is missed at %s ' , $ jobCode , $ schedule ->getScheduledAt ());
991
+ $ result = $ this ->retrier ->execute (
992
+ function () use ($ resource , $ connection , $ scheduleId , $ message ) {
993
+ return $ connection ->update (
994
+ $ resource ->getTable ('cron_schedule ' ),
995
+ ['status ' => Schedule::STATUS_MISSED , 'messages ' => $ message ],
996
+ ['schedule_id = ? ' => $ scheduleId , 'status = ? ' => Schedule::STATUS_PENDING ]
997
+ );
998
+ },
999
+ $ connection
1000
+ );
1001
+ if ($ result == 1 ) {
1002
+ $ schedule ->setStatus (Schedule::STATUS_MISSED );
1003
+ $ schedule ->setMessages ($ message );
1004
+ if ($ this ->state ->getMode () === State::MODE_DEVELOPER ) {
1005
+ $ this ->logger ->info ($ message );
1006
+ }
1007
+ }
1008
+ }
1009
+
1010
+ /**
1011
+ * Check if job should be run
1012
+ *
1013
+ * @param Schedule $schedule
1014
+ * @param string $groupId
1015
+ * @param int $currentTime
1016
+ * @param int $scheduledTime
1017
+ * @return bool
1018
+ */
1019
+ private function shouldRunJob (Schedule $ schedule , string $ groupId , int $ currentTime , int $ scheduledTime ): bool
1020
+ {
1021
+ if ($ scheduledTime > $ currentTime ) {
1022
+ return false ;
1023
+ }
1024
+
1025
+ $ scheduleLifetime = $ this ->getCronGroupConfigurationValue ($ groupId , self ::XML_PATH_SCHEDULE_LIFETIME );
1026
+ $ scheduleLifetime = $ scheduleLifetime * self ::SECONDS_IN_MINUTE ;
1027
+
1028
+ if ($ scheduledTime < $ currentTime - $ scheduleLifetime ) {
1029
+ $ this ->markJobAsMissed ($ schedule );
1030
+ return false ;
1031
+ }
1032
+
1033
+ return true ;
1034
+ }
983
1035
}
0 commit comments