custom/plugins/CrswCleverReachOfficial/src/Core/Infrastructure/TaskExecution/QueueItemStarter.php line 113

Open in your IDE?
  1. <?php
  2. namespace Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution;
  3. use Exception;
  4. use Crsw\CleverReachOfficial\Core\Infrastructure\Configuration\ConfigurationManager;
  5. use Crsw\CleverReachOfficial\Core\Infrastructure\Logger\Logger;
  6. use Crsw\CleverReachOfficial\Core\Infrastructure\Serializer\Serializer;
  7. use Crsw\CleverReachOfficial\Core\Infrastructure\ServiceRegister;
  8. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Exceptions\AbortTaskExecutionException;
  9. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Exceptions\ExecutionRequirementsNotMetException;
  10. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Exceptions\QueueStorageUnavailableException;
  11. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Interfaces\Runnable;
  12. /**
  13.  * Class QueueItemStarter
  14.  * @package Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution
  15.  */
  16. class QueueItemStarter implements Runnable
  17. {
  18.     /**
  19.      * Id of queue item to start.
  20.      *
  21.      * @var int
  22.      */
  23.     private $queueItemId;
  24.     /**
  25.      * Service instance.
  26.      *
  27.      * @var QueueService
  28.      */
  29.     private $queueService;
  30.     /**
  31.      * Service instance.
  32.      *
  33.      * @var ConfigurationManager
  34.      */
  35.     private $configurationManager;
  36.     /**
  37.      * QueueItemStarter constructor.
  38.      *
  39.      * @param int $queueItemId Id of queue item to start.
  40.      */
  41.     public function __construct($queueItemId)
  42.     {
  43.         $this->queueItemId $queueItemId;
  44.     }
  45.     /**
  46.      * Transforms array into an serializable object,
  47.      *
  48.      * @param array $array Data that is used to instantiate serializable object.
  49.      *
  50.      * @return \Crsw\CleverReachOfficial\Core\Infrastructure\Serializer\Interfaces\Serializable
  51.      *      Instance of serialized object.
  52.      */
  53.     public static function fromArray(array $array)
  54.     {
  55.         return new static($array['queue_item_id']);
  56.     }
  57.     /**
  58.      * Transforms serializable object into an array.
  59.      *
  60.      * @return array Array representation of a serializable object.
  61.      */
  62.     public function toArray()
  63.     {
  64.         return array('queue_item_id' => $this->queueItemId);
  65.     }
  66.     /**
  67.      * @inheritdoc
  68.      */
  69.     public function serialize()
  70.     {
  71.         return Serializer::serialize(array($this->queueItemId));
  72.     }
  73.     /**
  74.      * @inheritdoc
  75.      */
  76.     public function unserialize($serialized)
  77.     {
  78.         list($this->queueItemId) = Serializer::unserialize($serialized);
  79.     }
  80.     /**
  81.      * Starts runnable run logic.
  82.      */
  83.     public function run()
  84.     {
  85.         /** @var \Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\QueueItem $queueItem */
  86.         $queueItem $this->fetchItem();
  87.         if ($queueItem === null || ($queueItem->getStatus() !== QueueItem::QUEUED)) {
  88.             Logger::logDebug(
  89.                 'Fail to start task execution because task no longer exists or it is not in queued state anymore.',
  90.                 'Core',
  91.                 array(
  92.                     'TaskId' => $this->getQueueItemId(),
  93.                     'Status' => $queueItem !== null $queueItem->getStatus() : 'unknown',
  94.                 )
  95.             );
  96.             return;
  97.         }
  98.         $queueService $this->getQueueService();
  99.         try {
  100.             $this->getConfigManager()->setContext($queueItem->getContext());
  101.             $queueService->validateExecutionRequirements($queueItem);
  102.             $queueService->start($queueItem);
  103.             $queueService->finish($queueItem);
  104.         } catch (QueueStorageUnavailableException $e) {
  105.             Logger::logInfo($e->getMessage(), 'Core', array('trace' => $e->getTraceAsString()));
  106.         } catch (ExecutionRequirementsNotMetException $e) {
  107.             $id $queueItem->getId();
  108.             Logger::logWarning(
  109.                 "Execution requirements not met for queue item [$id] because:" .
  110.                 $e->getMessage(),
  111.                 'Core',
  112.                 array('ExceptionTrace' => $e->getTraceAsString())
  113.             );
  114.         } catch (AbortTaskExecutionException $exception) {
  115.             $queueService->abort($queueItem$exception->getMessage());
  116.         } catch (Exception $ex) {
  117.             if (QueueItem::IN_PROGRESS === $queueItem->getStatus()) {
  118.                 $queueService->fail($queueItem$ex->getMessage());
  119.             }
  120.             $context = array(
  121.                 'TaskId' => $this->getQueueItemId(),
  122.                 'ExceptionMessage' => $ex->getMessage(),
  123.                 'ExceptionTrace' => $ex->getTraceAsString(),
  124.             );
  125.             Logger::logError("Fail to start task execution because: {$ex->getMessage()}."'Core'$context);
  126.         }
  127.     }
  128.     /**
  129.      * Gets id of a queue item that will be run.
  130.      *
  131.      * @return int Id of queue item to run.
  132.      */
  133.     public function getQueueItemId()
  134.     {
  135.         return $this->queueItemId;
  136.     }
  137.     /**
  138.      * Gets Queue item.
  139.      *
  140.      * @return QueueItem|null Queue item if found; otherwise, null.
  141.      */
  142.     private function fetchItem()
  143.     {
  144.         $queueItem null;
  145.         try {
  146.             $queueItem $this->getQueueService()->find($this->queueItemId);
  147.         } catch (Exception $ex) {
  148.             return null;
  149.         }
  150.         return $queueItem;
  151.     }
  152.     /**
  153.      * Gets Queue service instance.
  154.      *
  155.      * @return QueueService Service instance.
  156.      */
  157.     private function getQueueService()
  158.     {
  159.         if ($this->queueService === null) {
  160.             $this->queueService ServiceRegister::getService(QueueService::CLASS_NAME);
  161.         }
  162.         return $this->queueService;
  163.     }
  164.     /**
  165.      * Gets configuration service instance.
  166.      *
  167.      * @return ConfigurationManager Service instance.
  168.      */
  169.     private function getConfigManager()
  170.     {
  171.         if ($this->configurationManager === null) {
  172.             $this->configurationManager ServiceRegister::getService(ConfigurationManager::CLASS_NAME);
  173.         }
  174.         return $this->configurationManager;
  175.     }
  176. }