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