diff --git a/Classes/Operation/HasStuckSchedulerTask.php b/Classes/Operation/HasStuckSchedulerTask.php new file mode 100644 index 00000000..25be8c67 --- /dev/null +++ b/Classes/Operation/HasStuckSchedulerTask.php @@ -0,0 +1,96 @@ +fetchSchedulerTasks(); + if (0 === count($schedulerRecords)) { + // No tasks found. + return new OperationResult(true, false); + } + + foreach ($schedulerRecords as $schedulerRecord) { + // Check if the task is running. + $isRunning = !empty($schedulerRecord['serialized_executions']); + if (!$isRunning) { + continue; + } + // Validate for required column value (lastexecution_time). + if (empty($schedulerRecord['lastexecution_time'])) { + continue; + } + + // Compare lastexecution_time with current time. + $currentDateTime = new DateTime(); + $lastExecutedDateTime = (new DateTime())->setTimestamp((int)$schedulerRecord['lastexecution_time']); + $runningHours = intval($currentDateTime->diff($lastExecutedDateTime)->format('%h')); + $runningHours += intval($currentDateTime->diff($lastExecutedDateTime)->days) * 24; + + if ($runningHours >= $maxRunningHours) { + return new OperationResult(true, true); + } + } + + // No task is running. + return new OperationResult(true, false); + } + + /** + * @return array + * + * @throws Exception|DBALException + */ + private function fetchSchedulerTasks() + { + /** @var ConnectionPool $connectionPool */ + $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); + $queryBuilder = $connectionPool->getQueryBuilderForTable('tx_scheduler_task'); + $queryBuilder + ->select('uid', 'serialized_executions', 'lastexecution_time') + ->from('tx_scheduler_task') + ->where( + $queryBuilder->expr()->eq('disable', $queryBuilder->createNamedParameter(0, Connection::PARAM_INT)) + ); + + if (version_compare(TYPO3_version, '9.0.0', '>=')) { + $queryBuilder->andWhere( + $queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, Connection::PARAM_INT)) + ); + } + + return $queryBuilder->execute()->fetchAllAssociative(); + } +} diff --git a/ext_localconf.php b/ext_localconf.php index 5e0e75cb..398330a4 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -35,6 +35,7 @@ 'GetFileSpoolValue' => \WapplerSystems\ZabbixClient\Operation\GetFileSpoolValue::class, 'GetDatabaseAnalyzerSummary' => \WapplerSystems\ZabbixClient\Operation\GetDatabaseAnalyzerSummary::class, 'HasFailedSchedulerTask' => \WapplerSystems\ZabbixClient\Operation\HasFailedSchedulerTask::class, + 'HasStuckSchedulerTask' => \WapplerSystems\ZabbixClient\Operation\HasStuckSchedulerTask::class, 'HasMissingDefaultMailSettings' => \WapplerSystems\ZabbixClient\Operation\HasMissingDefaultMailSettings::class, 'HasOutdatedVersion' => \WapplerSystems\ZabbixClient\Operation\HasOutdatedVersion::class, 'HasIPTCPreservation' => \WapplerSystems\ZabbixClient\Operation\HasIPTCPreservation::class,