diff --git a/lang/en.yml b/lang/en.yml index 0de2d11..d479ad5 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -19,6 +19,8 @@ en: PLURALNAME: 'Queued Job Rules' SINGULARNAME: 'Queued Job Rule' QueuedJobs: + BROKEN_JOB: 'Broken job' + BROKEN_JOB_MSG: 'The following job(s) appear to be broken. Log in to %s to see further details and take any necessary actions.' CREATE_JOB_TYPE: 'Create job of type' CREATE_NEW_JOB: 'Create new job' JOB_EXCEPT: 'Job caused exception %s in %s at line %s' diff --git a/src/Services/EmailService.php b/src/Services/EmailService.php index 0aae9d1..e373cc1 100644 --- a/src/Services/EmailService.php +++ b/src/Services/EmailService.php @@ -6,7 +6,6 @@ use SilverStripe\Control\Email\Email; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Injector\Injectable; -use SilverStripe\Subsites\Model\Subsite; /** * Class EmailService @@ -35,11 +34,6 @@ public function __construct() ); } - /** - * @param array $jobConfig - * @param string $title - * @return Email|null - */ public function createMissingDefaultJobReport(array $jobConfig, string $title): ?Email { $subject = sprintf('Default Job "%s" missing', $title); @@ -59,12 +53,6 @@ public function createMissingDefaultJobReport(array $jobConfig, string $title): ->setHTMLTemplate('QueuedJobsDefaultJob'); } - /** - * @param string $subject - * @param string $message - * @param int $jobID - * @return Email|null - */ public function createStalledJobReport(string $subject, string $message, int $jobID): ?Email { $email = $this->createReport($subject); @@ -81,12 +69,18 @@ public function createStalledJobReport(string $subject, string $message, int $jo ->setHTMLTemplate('QueuedJobsStalledJob'); } + public function createBrokenJobReport(string $subject, string $message): ?Email + { + $email = $this->createReport($subject); + if ($email === null) { + return null; + } + return $email->text($message); + } + /** * Create a generic email report * useful for reporting queue service issues - * - * @param string $subject - * @return Email|null */ public function createReport(string $subject): ?Email { diff --git a/src/Services/QueuedJobService.php b/src/Services/QueuedJobService.php index 20eddc4..90b2670 100644 --- a/src/Services/QueuedJobService.php +++ b/src/Services/QueuedJobService.php @@ -519,6 +519,24 @@ public function checkJobHealth($queue = null) ] ); + // Send broken job email notification + $subject = _t(__CLASS__ . '.BROKEN_JOB', 'Broken job'); + $message = sprintf(_t( + __CLASS__ . '.BROKEN_JOB_MSG', + implode(' ', [ + 'The following job(s) appear to be broken.', + 'Log in to %s to see further details and take any necessary actions.', + ]) + ), Director::absoluteBaseURL()); + foreach ($brokenJobs as $brokenJob) { + $message .= sprintf("\n- %s (ID: %s)", $brokenJob->JobTitle, $brokenJob->ID); + } + $email = EmailService::singleton()->createBrokenJobReport($subject, $message); + if ($email) { + $email->sendPlain(); + } + + // Mark broken jobs as notified $placeholders = implode(', ', array_fill(0, count($brokenIDs ?? []), '?')); $query = SQLUpdate::create( '"QueuedJobDescriptor"',