Я использую Symfony framework 3 с LeezyPheanstalkBundle. Это мой первый раз, используя Pheanstalk. Я хотел бы создать событие, которое начнется при создании новой электростанции. Я создал подписчика, менеджера заданий, класса работы. Код работает. Я могу видеть, что данные отправляются в трубу, а работа удаляется сама по себе, как я сделал для подписчика. Я не понимаю, почему после этого ничего не происходит. в этой строке кода я расскажу, какую команду я хочу установить:
$ This-> jobManager-> createJob ( "power_plant: создать", $ полезной нагрузки);
если я попробую проверить код с кешем: clear или doctrine: generate: entity и ничего не делать. Поэтому мой вопрос заключается в том, где я объявляю, какую команду я хотел бы запустить, и если я должен создать команду слишком, или я могу использовать служебную или классную ведьму, которую я хотел бы запустить, когда мое событие запущено? Я уже создал свой собственный класс с параметром power plant name и создаю несколько дополнительных таблиц для этой новой электростанции. Я хотел бы сделать это с помощью pheanstalk, но вот моя проблема, что я не знаю, почему эти команды не работают, как я ожидал. А также документация для этого очень плохая.
Подписчик Evet:
<?php namespace AppBundle\EventListener; use AppBundle\Event\PowerPlantEvent; use AppBundle\Manager\ManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use AppBundle\Event\Events; class PowerPlantSubscriber implements EventSubscriberInterface { protected $jobManager; public function __construct(ManagerInterface $jobManager) { $this->jobManager = $jobManager; } public static function getSubscribedEvents() { return [ Events::POWERPLANT_CREATE => ['onPowerPlantCreate', 0], Events::POWERPLANT_DELETE => ['onPowerPlantDelete', 0], ]; } public function onPowerPlantCreate(PowerPlantEvent $event) { $power_plant = $event->getPowerPlant(); $payload = [ "name" => $power_plant->getName(), "tech_name" => $power_plant->getTechName(), "system" => $power_plant->getSystem() ]; //$job = $this->jobManager->createJob("power_plant:create",$payload); $job = $this->jobManager->createJob('doctrine:generate:entity --entity=AppBundle:Test --format=annotation --fields="title:string(255) body:text" --no-interaction',$payload); $data = $this->jobManager->getData($job); $this->jobManager->deleteJob($job); } public function onPowerPlantDelete(PowerPlantEvent $event) { $power_plant = $event->getPowerPlant(); $payload = [ "name" => $power_plant->getName(), "tech_name" => $power_plant->getTechName(), "system" => $power_plant->getSystem() ]; $job = $this->jobManager->createJob("power_plant:delete",$payload); $data = $this->jobManager->getData($job); $this->jobManager->deleteJob($job); } }
Менеджер по работе с клиентами:
namespace AppBundle\Manager; use Leezy\PheanstalkBundle\Proxy\PheanstalkProxy; use AppBundle\Queue\Job; /** * Job manager class */ abstract class JobManager implements ManagerInterface { /** * @var $pheanstalk */ protected $pheanstalk; /** * @var $name */ protected $name; /** *@var job; */ protected $job; public function __construct(PheanstalkProxy $pheanstalk, Job $job) { $this->pheanstalk = $pheanstalk; $this->job = $job; } /** * Create job using pheanstalk * * @var $command * @var $payload */ public function createJob($command, $payload) { $jobData = [ "command" => $command, "meta" => $payload ]; $this->pheanstalk->useTube($this->tubeName); return $this->job->enqueue($command, $jobData, $this->tubeName); } /** * Get job data * * @var $job */ public function getData($job) { return $job->getData(); } /** * Delete job * * @var $job */ public function deleteJob($job) { return $this->job->deleteJob($job); } /** * Set tube name * * @var $name */ public function setTubeName($name) { $this->tubeName = $name; } }
Класс работы:
namespace AppBundle\Queue; use Leezy\PheanstalkBundle\Proxy\PheanstalkProxy; class Job { /** * @var $pheanstalk */ protected $pheanstalk; public function __construct(PheanstalkProxy $pheanstalk) { $this->pheanstalk = $pheanstalk; } /** * Preform job * * @var $job * @var array $args * @var string $tubeName * @var integer $priority * @var integer $delay * @var integer $ttr */ public function enqueue($job, array $args, $tubeName, $priority = 65536, $delay = 0, $ttr = 120) { if (!preg_match('/[a-z0-9\.]+/i', $job)) { throw new InvalidArgumentException("Invalid job name"); } $this->pheanstalk->put(json_encode($args), $priority, $delay, $ttr); return $this->pheanstalk->watch($tubeName)->ignore('default')->reserve(); } /** * Delete job * * @var $job */ public function deleteJob($job) { $this->pheanstalk->delete($job); } }