/** * Endpoint to post a job to queue. * @return mixed * @throws \yii\web\ServerErrorHttpException When failed to post. */ public function actionPost() { $job = $this->createJobFromRequest(); /* @var $queue \vm\queue\Queue */ if ($this->queue->post($job)) { return ['status' => 'okay', 'jobId' => $job->id]; } else { throw new \yii\web\ServerErrorHttpException('Failed to post job'); } }
/** * @param \yii\base\Event $event The event to handle. * * @return void */ public function routeEvent(\yii\base\Event $event) { $eventName = $event->name; $handler = $this->events[$eventName]; if (is_callable($handler)) { $handler = call_user_func($handler, $this->owner); } $route = $handler[0]; unset($handler[0]); $data = $handler; $this->queue->post(new \vm\queue\Job(['route' => $route, 'data' => $data])); }
/** * Call the behavior owner to handle the deferred event. * * @param \yii\base\Event $event The event to process. * * @return void * @throws \Exception When the sender is not DeferredEventInterface. */ public function postDeferredEvent(\yii\base\Event $event) { $object = clone $this->owner; if (!$this->_hasEventHandlers && !$object instanceof DeferredEventInterface) { throw new \Exception('Model is not instance of DeferredEventInterface'); } $handlers = $this->_hasEventHandlers ? $this->events : false; $eventName = $event->name; if (isset($this->_serializer)) { $serializer = $this->_serializer; } else { $serializer = null; } $this->queue->post(new \vm\queue\Job(['route' => function () use($object, $eventName, $handlers, $serializer) { if ($handlers) { $handler = $handlers[$eventName]; if ($serializer !== null) { try { $unserialized = $serializer->unserialize($handler); $unserialized($object); } catch (\Exception $exc) { return call_user_func([$object, $handler]); } } else { return call_user_func([$object, $handler]); } } else { if ($object instanceof DeferredEventInterface) { /* @var $object DeferredEventInterface */ return $object->handleDeferredEvent($eventName); } else { throw new \Exception("Model doesn't have handlers for the event or is not instance of DeferredEventInterface"); } } }])); }