diff --git a/lang/en.yml b/lang/en.yml index 0de2d11c..f9996705 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -19,6 +19,8 @@ en: PLURALNAME: 'Queued Job Rules' SINGULARNAME: 'Queued Job Rule' QueuedJobs: + BROKEN_JOBS: 'Broken job(s)' + BROKEN_JOBS_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 0aae9d19..1c6b1a82 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,22 @@ public function createStalledJobReport(string $subject, string $message, int $jo ->setHTMLTemplate('QueuedJobsStalledJob'); } + public function createBrokenJobsReport(string $subject, string $message): ?Email + { + $email = $this->createReport($subject); + if ($email === null) { + return null; + } + return $email + ->setData([ + 'Message' => $message, + ]) + ->setHTMLTemplate('QueuedJobsBrokenJobs'); + } + /** * 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 20eddc46..b5eba247 100644 --- a/src/Services/QueuedJobService.php +++ b/src/Services/QueuedJobService.php @@ -519,6 +519,26 @@ public function checkJobHealth($queue = null) ] ); + // Send broken job email notification + $subject = _t(__CLASS__ . '.BROKEN_JOBS', 'Broken job(s)'); + $message = htmlentities(sprintf(_t( + __CLASS__ . '.BROKEN_JOBS_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) { + // Using htmlentities() because of the use of $Message.RAW in QueuedJobsBrokenJobs.ss + // in order for the
tags to render as HTML + $message .= sprintf("
- %s (ID: %s)", htmlentities($brokenJob->JobTitle), $brokenJob->ID); + } + $email = EmailService::singleton()->createBrokenJobsReport($subject, $message); + if ($email) { + $email->send(); + } + + // Mark broken jobs as notified $placeholders = implode(', ', array_fill(0, count($brokenIDs ?? []), '?')); $query = SQLUpdate::create( '"QueuedJobDescriptor"', diff --git a/templates/QueuedJobsBrokenJobs.ss b/templates/QueuedJobsBrokenJobs.ss new file mode 100644 index 00000000..74a4c9ac --- /dev/null +++ b/templates/QueuedJobsBrokenJobs.ss @@ -0,0 +1 @@ +$Message.RAW