public function testGetByType() { $this->assertEquals(0, count(StuckJob::getAll())); $stuckJob = new StuckJob(); $stuckJob->type = 'abc'; $stuckJob->quantity = 3; $this->assertTrue($stuckJob->save()); $stuckJob = new StuckJob(); $stuckJob->type = 'abc'; $stuckJob->quantity = 3; $this->assertTrue($stuckJob->save()); $stuckJob = new StuckJob(); $stuckJob->type = 'def'; $stuckJob->quantity = 3; $this->assertTrue($stuckJob->save()); $stuckJob = StuckJob::getByType('abc'); $this->assertEquals(1, count($stuckJob)); $this->assertEquals('abc', $stuckJob->type); $this->assertTrue($stuckJob->id > 0); $stuckJob = StuckJob::getByType('def'); $this->assertEquals(1, count($stuckJob)); $this->assertEquals('def', $stuckJob->type); $this->assertTrue($stuckJob->id > 0); $stuckJob = StuckJob::getByType('hij'); $this->assertEquals(1, count($stuckJob)); $this->assertTrue($stuckJob->id < 0); }
public function run() { $jobsInProcess = static::getNonMonitorJobsInProcessModels(); $jobsAreStuck = false; $jobTitleLabels = array(); $jobsInProcessToReset = array(); foreach ($jobsInProcess as $jobInProcess) { if (JobsManagerUtil::isJobInProcessOverThreshold($jobInProcess, $jobInProcess->type)) { $stuckJob = StuckJob::getByType($jobInProcess->type); $stuckJob->quantity = $stuckJob->quantity + 1; if (!$stuckJob->save()) { throw new FailedToSaveModelException(); } $jobsInProcessToReset[] = $jobInProcess; //Only processes once the threshold is reach, not each time after that if ($stuckJob->quantity == static::$stuckNotificationThreshold) { $jobTitleLabels[] = strval($jobInProcess); $jobsAreStuck = true; } } } if ($jobsAreStuck) { self::makeJobStuckNotification($jobTitleLabels); } foreach ($jobsInProcessToReset as $jobInProcessToReset) { $jobInProcessToReset->delete(); } $jobLogs = static::getNonMonitorJobLogsUnprocessedWithErrors(); foreach ($jobLogs as $jobLog) { $message = new NotificationMessage(); $commonMessage = Zurmo::t('JobsManagerModule', 'Job completed with errors.'); $message->htmlContent = $commonMessage; $url = Yii::app()->createAbsoluteUrl('jobsManager/default/jobLogDetails/', array('id' => $jobLog->id)); $message->htmlContent .= "<br/>" . ZurmoHtml::link(Zurmo::t('Core', 'Click Here'), $url, array('target' => '_blank')); $message->textContent = $commonMessage; $message->textContent .= "\n" . Zurmo::t('JobsManagerModule', 'See the job log details in this link: {url}', array('{url}' => ShortUrlUtil::createShortUrl($url))); $rules = new JobCompletedWithErrorsNotificationRules(); NotificationsUtil::submit($message, $rules); $jobLog->isProcessed = true; $jobLog->save(); } $this->updateUnprocessedJobLogsWithoutErrors(); return true; }
/** * Given a 'type' of job, run the job. This is for non-monitor jobs only. * @param $type * @param MessageLogger $messageLogger * @param $isJobInProgress * @throws FailedToSaveModelException */ public static function runNonMonitorJob($type, MessageLogger $messageLogger, &$isJobInProgress) { assert('is_string($type) && $type != "Monitor"'); assert('is_bool($isJobInProgress)'); try { JobInProcess::getByType($type); $messageLogger->addInfoMessage("Existing job detected"); $isJobInProgress = true; } catch (NotFoundException $e) { $jobInProcess = new JobInProcess(); $jobInProcess->type = $type; $jobInProcess->save(); $startDateTime = $jobInProcess->createdDateTime; $jobClassName = $type . 'Job'; $job = new $jobClassName(); $job->setMessageLogger($messageLogger); $ranSuccessfully = $job->run(); $errorMessage = $job->getErrorMessage(); $jobInProcess->delete(); $jobLog = new JobLog(); $jobLog->type = $type; $jobLog->startDateTime = $startDateTime; $jobLog->endDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); if ($ranSuccessfully) { $messageLogger->addInfoMessage("Job completed successfully"); $jobLog->status = JobLog::STATUS_COMPLETE_WITHOUT_ERROR; } else { $messageLogger->addInfoMessage("Job completed with errors"); $jobLog->status = JobLog::STATUS_COMPLETE_WITH_ERROR; $jobLog->message = $errorMessage; } $jobLog->isProcessed = false; if (!$jobLog->save()) { throw new FailedToSaveModelException(); } $stuckJob = StuckJob::getByType($type); $stuckJob->quantity = 0; if (!$stuckJob->save()) { throw new FailedToSaveModelException(); } } }