/** * Run * * @param Aoe_Scheduler_Model_Schedule $schedule * @return string * @throws Exception */ public function run(Aoe_Scheduler_Model_Schedule $schedule) { // in case you're interested how often this was repeated so far... $currentRepetition = $schedule->getRepetition(); $numberOfMessagesToFetch = 10; // [...] $result = $sqsClient->receiveMessage(['AttributeNames' => ['All'], 'MaxNumberOfMessages' => $numberOfMessagesToFetch, 'QueueUrl' => $queueUrl]); $messages = $result->search('Messages[]'); if (count($messages) == 0) { $schedule->setStatus(Aoe_Scheduler_Model_Schedule::STATUS_DIDNTDOANYTHING); return; } // process messages foreach ($messages as $message) { // do something with the message // [...] $sqsClient->deleteMessage(['QueueUrl' => $queueUrl, 'ReceiptHandle' => $message['ReceiptHandle']]); } if (count($messages) == $numberOfMessagesToFetch) { // there might be more messages on the queue $schedule->setStatus(Aoe_Scheduler_Model_Schedule::STATUS_REPEAT); } else { $schedule->setStatus(Aoe_Scheduler_Model_Schedule::STATUS_SUCCESS); } }
/** * Decorate message * * @param string $value * @param Aoe_Scheduler_Model_Schedule $row * * @return string */ public function decorateMessages($value, Aoe_Scheduler_Model_Schedule $row) { $return = ''; if (!empty($value)) { $return .= '<a href="#" onclick="$(\'messages_' . $row->getScheduleId() . '\').toggle(); return false;">' . $this->__('Message') . '</a>'; $return .= '<div class="schedule-message" id="messages_' . $row->getScheduleId() . '" style="display: none; width: 300px; overflow: auto; font-size: small;"><pre>' . $value . '</pre></div>'; } return $return; }
/** * @test * @depends checkClass */ public function runTask(Aoe_Scheduler_Model_Schedule $schedule) { $jobCode = 'aoescheduler_testtask'; $schedule->setJobCode($jobCode); $schedule->runNow(false); $scheduleId = $schedule->getId(); $this->assertTrue(intval($schedule->getId()) > 0); $loadedSchedule = Mage::getModel('cron/schedule')->load($scheduleId); /* @var $loadedSchedule Aoe_Scheduler_Model_Schedule */ $this->assertEquals($scheduleId, $loadedSchedule->getId()); $this->assertEquals(gethostname(), $loadedSchedule->getHost()); $this->assertEquals(getmypid(), $loadedSchedule->getPid()); $this->assertEquals(Mage_Cron_Model_Schedule::STATUS_SUCCESS, $loadedSchedule->getStatus()); $this->assertEventDispatched(array('cron_after', 'cron_after_success', 'cron_' . $jobCode . '_after', 'cron_' . $jobCode . '_after_success', 'cron_before', 'cron_' . $jobCode . '_before')); }
/** * Reindex community indexers * * @param Aoe_Scheduler_Model_Schedule $schedule * @return Aoe_EeIndexerStats_Model_Observer */ public function reindexCeIndexer(Aoe_Scheduler_Model_Schedule $schedule) { if ($parameters = $schedule->getParameters()) { $codes = json_decode($parameters); foreach ($codes as $code) { if ($process = Mage::getModel('index/indexer')->getProcessByCode($code)) { /* @var $process Mage_Index_Model_Process */ $process->reindexAll(); } } } else { throw new Enterprise_Index_Exception('Set the cron parameters (Ex. ["catalog_category_flat","catalog_product_flat"]) to run the indexing'); } return $this; }
/** * General purpose test task. * Behavior can be controlled via parameters * * @param Aoe_Scheduler_Model_Schedule $schedule * @return string * @throws Exception */ public function run(Aoe_Scheduler_Model_Schedule $schedule) { $parameters = $schedule->getParameters(); if ($parameters) { $parameters = json_decode($parameters, true); } // fake duration $duration = 0; if ($parameters && isset($parameters['duration'])) { $duration = $parameters['duration']; } sleep($duration); /* // testing the error log feature... array_keys('ssdsd'); error_log( "Hello, errors!" ); $t = I_AM_NOT_DEFINED; */ if ($parameters && $parameters['outcome'] == 'error') { return 'ERROR: This schedule has failed.'; } if ($parameters && $parameters['outcome'] == 'nothing') { return 'NOTHING: Did not do anything'; } if ($parameters && $parameters['outcome'] == 'repeat') { return 'REPEAT'; } if ($parameters && $parameters['outcome'] == 'exception') { throw new Exception('This is a dummy exception'); } // Simulating ETA; // $starttime = time(); // // $endtime = $starttime + rand(180, 360); // $endtime = $starttime + $duration; // $schedule // ->setEta(strftime('%Y-%m-%d %H:%M:%S', $endtime)) // ->save(); // while ($endtime > time()) { // sleep(5); // $schedule // ->setProgressMessage('Work in progress. Time spent: ' . (time() - $starttime)) // ->setEta(strftime('%Y-%m-%d %H:%M:%S', $endtime)) // ->save(); // } // // $schedule // ->setProgressMessage('') // ->save(); }
/** * Run a test task * * @param Aoe_Scheduler_Model_Schedule $schedule */ public function run(Aoe_Scheduler_Model_Schedule $schedule) { $starttime = time(); // $endtime = $starttime + rand(180, 360); $endtime = $starttime + 5; $schedule->setEta(strftime('%Y-%m-%d %H:%M:%S', $endtime))->save(); while ($endtime > time()) { sleep(5); $schedule->setProgressMessage('Work in progress. Time spent: ' . (time() - $starttime))->setEta(strftime('%Y-%m-%d %H:%M:%S', $endtime))->save(); } $schedule->setProgressMessage('')->save(); /* if (rand(0, 1) == 0) { throw new Exception('This is a dummy exception'); } */ }
/** * Get attributes for div representing a gantt element * * @param Aoe_Scheduler_Model_Schedule $schedule * @return string */ public function getGanttDivAttributes(Aoe_Scheduler_Model_Schedule $schedule) { if ($schedule->getStatus() == Mage_Cron_Model_Schedule::STATUS_RUNNING) { $duration = time() - strtotime($schedule->getExecutedAt()); } else { $duration = $schedule->getDuration() ? $schedule->getDuration() : 0; } $duration = $duration / $this->zoom; $duration = ceil($duration / 4) * 4 - 1; // round to numbers dividable by 4, then remove 1 px border $duration = max($duration, 3); $offset = (strtotime($schedule->getStarttime()) - $this->starttime) / $this->zoom; if ($offset < 0) { // cut bar $duration += $offset; $offset = 0; } return sprintf('class="task %s" id="id_%s" style="width: %spx; left: %spx;"', $schedule->getStatus(), $schedule->getScheduleId(), $duration, $offset); }