示例#1
0
 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);
 }
示例#2
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;
 }
 public function testRunAndProcessStuckJobs()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $emailAddress = new Email();
     $emailAddress->emailAddress = '*****@*****.**';
     Yii::app()->user->userModel->primaryEmail = $emailAddress;
     $saved = Yii::app()->user->userModel->save();
     $this->assertTrue($saved);
     $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount());
     $this->assertEquals(0, Yii::app()->emailHelper->getSentCount());
     $monitorJob = new MonitorJob();
     $this->assertEquals(0, JobInProcess::getCount());
     $this->assertEquals(0, StuckJob::getCount());
     $this->assertEquals(0, Notification::getCount());
     $this->assertEquals(0, EmailMessage::getCount());
     $jobInProcess = new JobInProcess();
     $jobInProcess->type = 'Test';
     $this->assertTrue($jobInProcess->save());
     //Should make createdDateTime long enough in past to trigger as stuck.
     $createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 10000);
     $sql = "Update item set createddatetime = '" . $createdDateTime . "' where id = " . $jobInProcess->getClassId('Item');
     ZurmoRedBean::exec($sql);
     $jobInProcess->forget();
     $monitorJob->run();
     $this->assertEquals(0, JobInProcess::getCount());
     //should still be 0 but the quantity should increase
     $this->assertEquals(0, Notification::getCount());
     //There should now be one stuck job with quantity 1
     $stuckJobs = StuckJob::getAll();
     $this->assertEquals(1, count($stuckJobs));
     $this->assertEquals('Test', $stuckJobs[0]->type);
     $this->assertEquals(1, $stuckJobs[0]->quantity);
     //Now it should increase to 2
     $jobInProcess = new JobInProcess();
     $jobInProcess->type = 'Test';
     $this->assertTrue($jobInProcess->save());
     //Should make createdDateTime long enough in past to trigger as stuck.
     $createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 10000);
     $sql = "Update item set createddatetime = '" . $createdDateTime . "' where id = " . $jobInProcess->getClassId('Item');
     ZurmoRedBean::exec($sql);
     $jobInProcess->forget();
     $monitorJob->run();
     $this->assertEquals(0, JobInProcess::getCount());
     //should still be 0 but the quantity should increase
     $this->assertEquals(0, Notification::getCount());
     //There should now be one stuck job with quantity 1
     $stuckJobs = StuckJob::getAll();
     $this->assertEquals(1, count($stuckJobs));
     $this->assertEquals('Test', $stuckJobs[0]->type);
     $this->assertEquals(2, $stuckJobs[0]->quantity);
     //Set quantity to 3, then run monitor again and notification should go out.
     $stuckJobs[0]->quantity = 3;
     $this->assertTrue($stuckJobs[0]->save());
     $jobInProcess = new JobInProcess();
     $jobInProcess->type = 'Test';
     $this->assertTrue($jobInProcess->save());
     //Should make createdDateTime long enough in past to trigger as stuck.
     $createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 10000);
     $sql = "Update item set createddatetime = '" . $createdDateTime . "' where id = " . $jobInProcess->getClassId('Item');
     ZurmoRedBean::exec($sql);
     $jobInProcess->forget();
     //Now the threshold of 4 should be reached and we should send a notification
     $monitorJob->run();
     ForgetAllCacheUtil::forgetAllCaches();
     $stuckJobs = StuckJob::getAll();
     $this->assertEquals(1, count($stuckJobs));
     $this->assertEquals('Test', $stuckJobs[0]->type);
     $this->assertEquals(4, $stuckJobs[0]->quantity);
     $this->assertEquals(1, Notification::getCount());
     //Confirm an email was sent
     $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount());
     $this->assertEquals(1, EmailMessage::getCount());
     $this->assertEquals(1, Yii::app()->emailHelper->getSentCount());
 }
 /**
  * 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();
         }
     }
 }