custom/plugins/CrswCleverReachOfficial/src/Core/Infrastructure/TaskExecution/QueueItem.php line 432

Open in your IDE?
  1. <?php
  2. namespace Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution;
  3. use DateTime;
  4. use InvalidArgumentException;
  5. use Crsw\CleverReachOfficial\Core\Infrastructure\Logger\Logger;
  6. use Crsw\CleverReachOfficial\Core\Infrastructure\ORM\Configuration\EntityConfiguration;
  7. use Crsw\CleverReachOfficial\Core\Infrastructure\ORM\Configuration\IndexMap;
  8. use Crsw\CleverReachOfficial\Core\Infrastructure\ORM\Entity;
  9. use Crsw\CleverReachOfficial\Core\Infrastructure\Serializer\Serializer;
  10. use Crsw\CleverReachOfficial\Core\Infrastructure\ServiceRegister;
  11. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Exceptions\QueueItemDeserializationException;
  12. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Interfaces\Priority;
  13. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\TaskEvents\AliveAnnouncedTaskEvent;
  14. use Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\TaskEvents\TaskProgressEvent;
  15. use Crsw\CleverReachOfficial\Core\Infrastructure\Utility\TimeProvider;
  16. /**
  17.  * Class QueueItem
  18.  *
  19.  * @package Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution
  20.  */
  21. class QueueItem extends Entity
  22. {
  23.     /**
  24.      * Fully qualified name of this class.
  25.      */
  26.     const CLASS_NAME __CLASS__;
  27.     /**
  28.      * Indicates the "created" state of the queue item.
  29.      */
  30.     const CREATED 'created';
  31.     /**
  32.      * Indicates the "queued" state of the queue item.
  33.      */
  34.     const QUEUED 'queued';
  35.     /**
  36.      * Indicates the "in progress" state of the queue item.
  37.      */
  38.     const IN_PROGRESS 'in_progress';
  39.     /**
  40.      * Indicates the "completed" state of the queue item.
  41.      */
  42.     const COMPLETED 'completed';
  43.     /**
  44.      * Indicates the "failed" state of the queue item.
  45.      */
  46.     const FAILED 'failed';
  47.     /**
  48.      * Indicates the "aborted" state of the queue item.
  49.      */
  50.     const ABORTED 'aborted';
  51.     /**
  52.      * Array of simple field names.
  53.      *
  54.      * @var array
  55.      */
  56.     protected $fields = array(
  57.         'id',
  58.         'status',
  59.         'context',
  60.         'serializedTask',
  61.         'queueName',
  62.         'lastExecutionProgressBasePoints',
  63.         'progressBasePoints',
  64.         'retries',
  65.         'failureDescription',
  66.         'createTime',
  67.         'startTime',
  68.         'finishTime',
  69.         'failTime',
  70.         'earliestStartTime',
  71.         'queueTime',
  72.         'lastUpdateTime',
  73.         'priority',
  74.         'equalityHash'
  75.     );
  76.     /**
  77.      * Queue item status.
  78.      *
  79.      * @var string
  80.      */
  81.     protected $status;
  82.     /**
  83.      * Task associated to queue item.
  84.      *
  85.      * @var Task
  86.      */
  87.     protected $task;
  88.     /**
  89.      * Context in which task will be executed.
  90.      *
  91.      * @var string
  92.      */
  93.     protected $context;
  94.     /**
  95.      * String representation of task.
  96.      *
  97.      * @var string
  98.      */
  99.     protected $serializedTask;
  100.     /**
  101.      * Integration queue name.
  102.      *
  103.      * @var string
  104.      */
  105.     protected $queueName;
  106.     /**
  107.      * Last execution progress base points (integer value of 0.01%).
  108.      *
  109.      * @var int $lastExecutionProgressBasePoints
  110.      */
  111.     protected $lastExecutionProgressBasePoints;
  112.     /**
  113.      * Current execution progress in base points (integer value of 0.01%).
  114.      *
  115.      * @var int $progressBasePoints
  116.      */
  117.     protected $progressBasePoints;
  118.     /**
  119.      * Number of attempts to execute task.
  120.      *
  121.      * @var int
  122.      */
  123.     protected $retries;
  124.     /**
  125.      * Description of failure when task fails.
  126.      *
  127.      * @var string
  128.      */
  129.     protected $failureDescription;
  130.     /**
  131.      * Datetime when queue item is created.
  132.      *
  133.      * @var \DateTime
  134.      */
  135.     protected $createTime;
  136.     /**
  137.      * Datetime when queue item is started.
  138.      *
  139.      * @var \DateTime
  140.      */
  141.     protected $startTime;
  142.     /**
  143.      * Datetime when queue item is finished.
  144.      *
  145.      * @var \DateTime
  146.      */
  147.     protected $finishTime;
  148.     /**
  149.      * Datetime when queue item is failed.
  150.      *
  151.      * @var \DateTime
  152.      */
  153.     protected $failTime;
  154.     /**
  155.      * Min datetime when queue item can start.
  156.      *
  157.      * @var \DateTime
  158.      */
  159.     protected $earliestStartTime;
  160.     /**
  161.      * Datetime when queue item is enqueued.
  162.      *
  163.      * @var \DateTime
  164.      */
  165.     protected $queueTime;
  166.     /**
  167.      * Datetime when queue item is last updated.
  168.      *
  169.      * @var \DateTime
  170.      */
  171.     protected $lastUpdateTime;
  172.     /**
  173.      * Specifies the execution priority of the queue item.
  174.      *
  175.      * @var int QueueItem execution priority.
  176.      */
  177.     protected $priority;
  178.     /**
  179.      * Specifies equality hash used to determine whether two queue items are the same
  180.      *
  181.      * @var string QueueItem equality hash
  182.      */
  183.     protected $equalityHash;
  184.     /**
  185.      * Instance of time provider.
  186.      *
  187.      * @var TimeProvider
  188.      */
  189.     private $timeProvider;
  190.     /**
  191.      * QueueItem constructor.
  192.      *
  193.      * @param Task|null $task Associated task object.
  194.      * @param string $context Context in which task will be executed.
  195.      */
  196.     public function __construct(Task $task null$context '')
  197.     {
  198.         $this->timeProvider ServiceRegister::getService(TimeProvider::CLASS_NAME);
  199.         $this->task $task;
  200.         $this->context $context;
  201.         $this->status self::CREATED;
  202.         $this->lastExecutionProgressBasePoints 0;
  203.         $this->progressBasePoints 0;
  204.         $this->retries 0;
  205.         $this->failureDescription '';
  206.         $this->createTime $this->timeProvider->getCurrentLocalTime();
  207.         $this->attachTaskEventHandlers();
  208.     }
  209.     /**
  210.      * Sets queue item id.
  211.      *
  212.      * @param int $id Queue item id.
  213.      */
  214.     public function setId($id)
  215.     {
  216.         parent::setId($id);
  217.         if ($this->task !== null) {
  218.             $this->task->setExecutionId($id);
  219.         }
  220.     }
  221.     /**
  222.      * Returns queueTime.
  223.      *
  224.      * @return \DateTime queueTime Queue date and time.
  225.      */
  226.     public function getQueueTime()
  227.     {
  228.         return $this->queueTime;
  229.     }
  230.     /**
  231.      * Returns lastUpdateTime.
  232.      *
  233.      * @return \DateTime lastUpdateTime Date and time of last update.
  234.      */
  235.     public function getLastUpdateTime()
  236.     {
  237.         return $this->lastUpdateTime;
  238.     }
  239.     /**
  240.      * Gets queue item status.
  241.      *
  242.      * @return string Queue item status.
  243.      */
  244.     public function getStatus()
  245.     {
  246.         return $this->status;
  247.     }
  248.     /**
  249.      * Sets queue item status.
  250.      *
  251.      * @param string $status Queue item status.
  252.      *  One of: QueueItem::CREATED, QueueItem::QUEUED, QueueItem::IN_PROGRESS, QueueItem::COMPLETED or QueueItem::FAILED
  253.      */
  254.     public function setStatus($status)
  255.     {
  256.         if (!in_array(
  257.             $status,
  258.             array(
  259.                 self::CREATED,
  260.                 self::QUEUED,
  261.                 self::IN_PROGRESS,
  262.                 self::COMPLETED,
  263.                 self::FAILED,
  264.                 self::ABORTED,
  265.             ),
  266.             false
  267.         )) {
  268.             throw new InvalidArgumentException(
  269.                 sprintf(
  270.                     'Invalid QueueItem status: "%s". '
  271.                     'Status must be one of "%s", "%s", "%s", "%s", "%s" or "%s" values.',
  272.                     $status,
  273.                     self::CREATED,
  274.                     self::QUEUED,
  275.                     self::IN_PROGRESS,
  276.                     self::COMPLETED,
  277.                     self::FAILED,
  278.                     self::ABORTED
  279.                 )
  280.             );
  281.         }
  282.         $this->status $status;
  283.     }
  284.     /**
  285.      * Gets queue item queue name.
  286.      *
  287.      * @return string Queue item queue name.
  288.      */
  289.     public function getQueueName()
  290.     {
  291.         return $this->queueName;
  292.     }
  293.     /**
  294.      * Sets queue item queue name.
  295.      *
  296.      * @param string $queueName Queue item queue name.
  297.      */
  298.     public function setQueueName($queueName)
  299.     {
  300.         $this->queueName $queueName;
  301.     }
  302.     /**
  303.      * Gets queue item last execution progress in base points as value between 0 and 10000.
  304.      *
  305.      * One base point is equal to 0.01%.
  306.      * For example 23.58% is equal to 2358 base points.
  307.      *
  308.      * @return int Last execution progress expressed in base points.
  309.      */
  310.     public function getLastExecutionProgressBasePoints()
  311.     {
  312.         return $this->lastExecutionProgressBasePoints;
  313.     }
  314.     /**
  315.      * Sets queue item last execution progress in base points, as value between 0 and 10000.
  316.      *
  317.      * One base point is equal to 0.01%.
  318.      * For example 23.58% is equal to 2358 base points.
  319.      *
  320.      * @param int $lastExecutionProgressBasePoints Queue item last execution progress in base points.
  321.      */
  322.     public function setLastExecutionProgressBasePoints($lastExecutionProgressBasePoints)
  323.     {
  324.         if (!is_int($lastExecutionProgressBasePoints) ||
  325.             $lastExecutionProgressBasePoints ||
  326.             10000 $lastExecutionProgressBasePoints) {
  327.             throw new InvalidArgumentException('Last execution progress percentage must be value between 0 and 100.');
  328.         }
  329.         $this->lastExecutionProgressBasePoints $lastExecutionProgressBasePoints;
  330.     }
  331.     /**
  332.      * Gets progress in percentage rounded to 2 decimal value.
  333.      *
  334.      * @return float QueueItem progress in percentage rounded to 2 decimal value.
  335.      */
  336.     public function getProgressFormatted()
  337.     {
  338.         return round($this->progressBasePoints 1002);
  339.     }
  340.     /**
  341.      * Gets queue item progress in base points as value between 0 and 10000.
  342.      *
  343.      * One base point is equal to 0.01%.
  344.      * For example 23.58% is equal to 2358 base points.
  345.      *
  346.      * @return int Queue item progress percentage in base points.
  347.      */
  348.     public function getProgressBasePoints()
  349.     {
  350.         return $this->progressBasePoints;
  351.     }
  352.     /**
  353.      * Sets queue item progress in base points, as value between 0 and 10000.
  354.      *
  355.      * One base point is equal to 0.01%.
  356.      * For example 23.58% is equal to 2358 base points.
  357.      *
  358.      * @param int $progressBasePoints Queue item progress in base points.
  359.      */
  360.     public function setProgressBasePoints($progressBasePoints)
  361.     {
  362.         if (!is_int($progressBasePoints) || $progressBasePoints || 10000 $progressBasePoints) {
  363.             throw new InvalidArgumentException('Progress percentage must be value between 0 and 100.');
  364.         }
  365.         $this->progressBasePoints $progressBasePoints;
  366.     }
  367.     /**
  368.      * Gets queue item retries count.
  369.      *
  370.      * @return int Queue item retries count.
  371.      */
  372.     public function getRetries()
  373.     {
  374.         return $this->retries;
  375.     }
  376.     /**
  377.      * Sets queue item retries count.
  378.      *
  379.      * @param int $retries Queue item retries count.
  380.      */
  381.     public function setRetries($retries)
  382.     {
  383.         $this->retries $retries;
  384.     }
  385.     /**
  386.      * Gets queue item task type.
  387.      *
  388.      * @return string Queue item task type.
  389.      *
  390.      * @throws \Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Exceptions\QueueItemDeserializationException
  391.      */
  392.     public function getTaskType()
  393.     {
  394.         return $this->getTask()->getType();
  395.     }
  396.     /**
  397.      * Gets queue item associated task or null if not set.
  398.      *
  399.      * @return Task Task from queue item associated task.
  400.      *
  401.      * @throws \Crsw\CleverReachOfficial\Core\Infrastructure\TaskExecution\Exceptions\QueueItemDeserializationException
  402.      */
  403.     public function getTask()
  404.     {
  405.         if ($this->task === null) {
  406.             $this->task Serializer::unserialize($this->serializedTask);
  407.             if (empty($this->task)) {
  408.                 throw new QueueItemDeserializationException(
  409.                     json_encode(
  410.                         array(
  411.                             'Message' => 'Unable to deserialize queue item task',
  412.                             'SerializedTask' => $this->serializedTask,
  413.                             'QueueItemId' => $this->getId(),
  414.                         )
  415.                     )
  416.                 );
  417.             }
  418.             $this->attachTaskEventHandlers();
  419.         }
  420.         return $this->task;
  421.     }
  422.     /**
  423.      * Gets serialized queue item task.
  424.      *
  425.      * @return string
  426.      *   Serialized representation of queue item task.
  427.      */
  428.     public function getSerializedTask()
  429.     {
  430.         if ($this->task === null) {
  431.             return $this->serializedTask;
  432.         }
  433.         return Serializer::serialize($this->task);
  434.     }
  435.     /**
  436.      * Sets serialized task representation.
  437.      *
  438.      * @param string $serializedTask Serialized representation of task.
  439.      */
  440.     public function setSerializedTask($serializedTask)
  441.     {
  442.         $this->serializedTask $serializedTask;
  443.         $this->task null;
  444.     }
  445.     /**
  446.      * Gets task execution context.
  447.      *
  448.      * @return string
  449.      *   Context in which task will be executed.
  450.      */
  451.     public function getContext()
  452.     {
  453.         return $this->context;
  454.     }
  455.     /**
  456.      * Sets task execution context. Context in which task will be executed.
  457.      *
  458.      * @param string $context Execution context.
  459.      */
  460.     public function setContext($context)
  461.     {
  462.         $this->context $context;
  463.     }
  464.     /**
  465.      * Gets queue item failure description.
  466.      *
  467.      * @return string
  468.      *   Queue item failure description.
  469.      */
  470.     public function getFailureDescription()
  471.     {
  472.         return $this->failureDescription;
  473.     }
  474.     /**
  475.      * Sets queue item failure description.
  476.      *
  477.      * @param string $failureDescription
  478.      *   Queue item failure description.
  479.      */
  480.     public function setFailureDescription($failureDescription)
  481.     {
  482.         $this->failureDescription $failureDescription;
  483.     }
  484.     /**
  485.      * Gets queue item created timestamp.
  486.      *
  487.      * @return int|null
  488.      *   Queue item created timestamp.
  489.      */
  490.     public function getCreateTimestamp()
  491.     {
  492.         return $this->getTimestamp($this->createTime);
  493.     }
  494.     /**
  495.      * Sets queue item created timestamp.
  496.      *
  497.      * @param int $timestamp
  498.      *   Sets queue item created timestamp.
  499.      */
  500.     public function setCreateTimestamp($timestamp)
  501.     {
  502.         $this->createTime $this->getDateTimeFromTimestamp($timestamp);
  503.     }
  504.     /**
  505.      * Gets queue item start timestamp or null if task is not started.
  506.      *
  507.      * @return int|null
  508.      *   Queue item start timestamp.
  509.      */
  510.     public function getStartTimestamp()
  511.     {
  512.         return $this->getTimestamp($this->startTime);
  513.     }
  514.     /**
  515.      * Sets queue item start timestamp.
  516.      *
  517.      * @param int $timestamp
  518.      *   Queue item start timestamp.
  519.      */
  520.     public function setStartTimestamp($timestamp)
  521.     {
  522.         $this->startTime $this->getDateTimeFromTimestamp($timestamp);
  523.     }
  524.     /**
  525.      * Gets queue item finish timestamp or null if task is not finished.
  526.      *
  527.      * @return int|null
  528.      *   Queue item finish timestamp.
  529.      */
  530.     public function getFinishTimestamp()
  531.     {
  532.         return $this->getTimestamp($this->finishTime);
  533.     }
  534.     /**
  535.      * Sets queue item finish timestamp.
  536.      *
  537.      * @param int $timestamp Queue item finish timestamp.
  538.      */
  539.     public function setFinishTimestamp($timestamp)
  540.     {
  541.         $this->finishTime $this->getDateTimeFromTimestamp($timestamp);
  542.     }
  543.     /**
  544.      * Gets queue item fail timestamp or null if task is not failed.
  545.      *
  546.      * @return int|null
  547.      *   Queue item fail timestamp.
  548.      */
  549.     public function getFailTimestamp()
  550.     {
  551.         return $this->getTimestamp($this->failTime);
  552.     }
  553.     /**
  554.      * Sets queue item fail timestamp.
  555.      *
  556.      * @param int $timestamp Queue item fail timestamp.
  557.      */
  558.     public function setFailTimestamp($timestamp)
  559.     {
  560.         $this->failTime $this->getDateTimeFromTimestamp($timestamp);
  561.     }
  562.     /**
  563.      * Gets queue item earliest start timestamp or null if not set.
  564.      *
  565.      * @return int|null
  566.      *   Queue item earliest start timestamp.
  567.      */
  568.     public function getEarliestStartTimestamp()
  569.     {
  570.         return $this->getTimestamp($this->earliestStartTime);
  571.     }
  572.     /**
  573.      * Sets queue item earliest start timestamp.
  574.      *
  575.      * @param int $timestamp Queue item earliest start timestamp.
  576.      */
  577.     public function setEarliestStartTimestamp($timestamp)
  578.     {
  579.         $this->earliestStartTime $this->getDateTimeFromTimestamp($timestamp);
  580.     }
  581.     /**
  582.      * Gets queue item queue timestamp or null if task is not queued.
  583.      *
  584.      * @return int|null
  585.      *   Queue item queue timestamp.
  586.      */
  587.     public function getQueueTimestamp()
  588.     {
  589.         return $this->getTimestamp($this->queueTime);
  590.     }
  591.     /**
  592.      * Gets queue item queue timestamp.
  593.      *
  594.      * @param int $timestamp Queue item queue timestamp.
  595.      */
  596.     public function setQueueTimestamp($timestamp)
  597.     {
  598.         $this->queueTime $this->getDateTimeFromTimestamp($timestamp);
  599.     }
  600.     /**
  601.      * Gets queue item last updated timestamp or null if task was never updated.
  602.      *
  603.      * @return int|null
  604.      *   Queue item last updated timestamp.
  605.      */
  606.     public function getLastUpdateTimestamp()
  607.     {
  608.         return $this->getTimestamp($this->lastUpdateTime);
  609.     }
  610.     /**
  611.      * Sets queue item last updated timestamp.
  612.      *
  613.      * @param int $timestamp
  614.      *   Queue item last updated timestamp.
  615.      */
  616.     public function setLastUpdateTimestamp($timestamp)
  617.     {
  618.         $this->lastUpdateTime $this->getDateTimeFromTimestamp($timestamp);
  619.     }
  620.     /**
  621.      * Gets queue item last execution progress in base points as value between 0 and 10000.
  622.      *
  623.      * One base point is equal to 0.01%.
  624.      * For example 23.58% is equal to 2358 base points.
  625.      *
  626.      * @return int Last execution progress expressed in base points.
  627.      */
  628.     public function getLastExecutionProgress()
  629.     {
  630.         return $this->lastExecutionProgressBasePoints;
  631.     }
  632.     /**
  633.      * Retrieves queue item execution priority.
  634.      *
  635.      * @return int QueueItem execution priority.
  636.      */
  637.     public function getPriority()
  638.     {
  639.         return $this->priority ?: Priority::NORMAL;
  640.     }
  641.     /**
  642.      * Calculates equality hash
  643.      *
  644.      * @param string $context
  645.      * @param string $queueName
  646.      * @param int $priority
  647.      * @param string $taskType
  648.      * @param array $taskEqualityComponents
  649.      *
  650.      * @return string
  651.      */
  652.     public static function calculateEqualityHash($context$queueName$priority$taskType$taskEqualityComponents)
  653.     {
  654.         $equalityComponentsToString json_encode($taskEqualityComponents);
  655.         $concatenatedValue $context $queueName $priority $taskType $equalityComponentsToString;
  656.         return hash('sha256'$concatenatedValue);
  657.     }
  658.     /**
  659.      * Return equality hash value
  660.      *
  661.      * @return string
  662.      */
  663.     public function getEqualityHash()
  664.     {
  665.         return $this->equalityHash;
  666.     }
  667.     /**
  668.      * Sets queue item equality hash value.
  669.      *
  670.      * @param string $equalityHash
  671.      */
  672.     public function setEqualityHash($equalityHash)
  673.     {
  674.         $this->equalityHash $equalityHash;
  675.     }
  676.     /**
  677.      * Sets queue item execution priority,.
  678.      *
  679.      * @param int $priority QueueItem execution priority.
  680.      */
  681.     public function setPriority($priority)
  682.     {
  683.         if (!in_array($priority, static::getAvailablePriorities(), true)) {
  684.             throw new InvalidArgumentException("Priority {$priority} is not supported.");
  685.         }
  686.         $this->priority $priority;
  687.     }
  688.     /**
  689.      * Reconfigures underlying task.
  690.      *
  691.      * @throws Exceptions\QueueItemDeserializationException
  692.      */
  693.     public function reconfigureTask()
  694.     {
  695.         $task $this->getTask();
  696.         if ($task->canBeReconfigured()) {
  697.             $task->reconfigure();
  698.             $this->setRetries(0);
  699.             Logger::logDebug('Task ' $this->getTaskType() . ' reconfigured.');
  700.         }
  701.     }
  702.     /**
  703.      * Returns entity configuration object.
  704.      *
  705.      * @return EntityConfiguration Configuration object.
  706.      */
  707.     public function getConfig()
  708.     {
  709.         $indexMap = new IndexMap();
  710.         $indexMap->addStringIndex('status')
  711.             ->addStringIndex('taskType')
  712.             ->addStringIndex('queueName')
  713.             ->addStringIndex('context')
  714.             ->addDateTimeIndex('queueTime')
  715.             ->addIntegerIndex('lastExecutionProgress')
  716.             ->addIntegerIndex('lastUpdateTimestamp')
  717.             ->addIntegerIndex('priority')
  718.             ->addStringIndex('equalityHash');
  719.         return new EntityConfiguration($indexMap'QueueItem');
  720.     }
  721.     /**
  722.      * Transforms entity to its array format representation.
  723.      *
  724.      * @return array Entity in array format.
  725.      */
  726.     public function toArray()
  727.     {
  728.         $this->serializedTask $this->getSerializedTask();
  729.         $result parent::toArray();
  730.         $result['createTime'] = $this->timeProvider->serializeDate($this->createTime);
  731.         $result['lastUpdateTime'] = $this->timeProvider->serializeDate($this->lastUpdateTime);
  732.         $result['queueTime'] = $this->timeProvider->serializeDate($this->queueTime);
  733.         $result['startTime'] = $this->timeProvider->serializeDate($this->startTime);
  734.         $result['finishTime'] = $this->timeProvider->serializeDate($this->finishTime);
  735.         $result['failTime'] = $this->timeProvider->serializeDate($this->failTime);
  736.         $result['earliestStartTime'] = $this->timeProvider->serializeDate($this->earliestStartTime);
  737.         $result['priority'] = $this->getPriority();
  738.         return $result;
  739.     }
  740.     /**
  741.      * Sets raw array data to this entity instance properties.
  742.      *
  743.      * @param array $data Raw array data with keys for class fields. @see self::$fields for field names.
  744.      */
  745.     public function inflate(array $data)
  746.     {
  747.         parent::inflate($data);
  748.         $this->createTime $this->timeProvider->deserializeDateString($data['createTime']);
  749.         $this->lastUpdateTime $this->timeProvider->deserializeDateString($data['lastUpdateTime']);
  750.         $this->queueTime $this->timeProvider->deserializeDateString($data['queueTime']);
  751.         $this->startTime $this->timeProvider->deserializeDateString($data['startTime']);
  752.         $this->finishTime $this->timeProvider->deserializeDateString($data['finishTime']);
  753.         $this->failTime $this->timeProvider->deserializeDateString($data['failTime']);
  754.         $this->earliestStartTime $this->timeProvider->deserializeDateString($data['earliestStartTime']);
  755.     }
  756.     /**
  757.      * Defines available priorities.
  758.      *
  759.      * @return array
  760.      */
  761.     public static function getAvailablePriorities()
  762.     {
  763.         return array(Priority::HIGHPriority::NORMALPriority::LOW);
  764.     }
  765.     /**
  766.      * Gets timestamp of datetime.
  767.      *
  768.      * @param \DateTime|null $time Datetime object.
  769.      *
  770.      * @return int|null
  771.      *   Timestamp of provided datetime or null if time is not defined.
  772.      */
  773.     protected function getTimestamp(DateTime $time null)
  774.     {
  775.         return $time !== null $time->getTimestamp() : null;
  776.     }
  777.     /**
  778.      * Gets \DateTime object from timestamp.
  779.      *
  780.      * @param int $timestamp Timestamp in seconds.
  781.      *
  782.      * @return \DateTime|null
  783.      *  Object if successful; otherwise, null;
  784.      */
  785.     protected function getDateTimeFromTimestamp($timestamp)
  786.     {
  787.         return !empty($timestamp) ? $this->timeProvider->getDateTime($timestamp) : null;
  788.     }
  789.     /**
  790.      * Attach Task event handlers.
  791.      */
  792.     private function attachTaskEventHandlers()
  793.     {
  794.         if ($this->task === null) {
  795.             return;
  796.         }
  797.         $this->task->setExecutionId($this->getId());
  798.         $self $this;
  799.         $this->task->when(
  800.             TaskProgressEvent::CLASS_NAME,
  801.             function (TaskProgressEvent $event) use ($self) {
  802.                 $queue = new QueueService();
  803.                 $queue->updateProgress($self$event->getProgressBasePoints());
  804.             }
  805.         );
  806.         $this->task->when(
  807.             AliveAnnouncedTaskEvent::CLASS_NAME,
  808.             function () use ($self) {
  809.                 $queue = new QueueService();
  810.                 $queue->keepAlive($self);
  811.             }
  812.         );
  813.     }
  814. }