Example #1
0
 /**
  * @param Daemon $daemon
  *
  * @return $this
  */
 public function run(Daemon $daemon)
 {
     /** @var NamedSocket[] $readable */
     $readable = [];
     /** @var NamedSocket[] $writable */
     $writable = [];
     $daemon->init();
     $context = $daemon->getContext();
     $context->zmqContext = $this->getZmqService()->createContext();
     $context->zmqOutgoingSockets = $this->getZmqService()->createSockets($daemon->getOutgoingSockets(), $context->zmqContext);
     $context->zmqIncomingSockets = $this->getZmqService()->createSockets($daemon->getIncomingSockets(), $context->zmqContext);
     $daemon->start();
     while ($daemon->isStarted()) {
         $in = [];
         $out = [];
         foreach ($context->zmqOutgoingSockets as $name => $socket) {
             if ($daemon->isQueueEmpty($name)) {
                 continue;
             }
             $out[] = $socket;
         }
         foreach ($context->zmqIncomingSockets as $name => $socket) {
             $in[] = $socket;
         }
         $poller = $this->getZmqService()->createPoller($in, $out);
         $events = $poller->poll($readable, $writable, -1);
         $errors = $poller->getLastErrors();
         if (0 < count($errors)) {
             throw new \RuntimeException(sprintf("Socket polling error: %s", array_shift($errors)), 500);
         }
         if (0 >= $events) {
             throw new \RuntimeException("No socket polling event", 500);
         }
         foreach ($readable as $r) {
             try {
                 $rawMsg = $r->recv();
                 $msg = @json_decode($rawMsg, true);
                 if (!$msg) {
                     throw new \RuntimeException(sprintf("Unable to parse incoming message: %s", $rawMsg), 412);
                 }
                 $daemon->receive($r->getName(), $msg);
             } catch (\Exception $e) {
                 $daemon->error($e);
             }
         }
         foreach ($writable as $w) {
             try {
                 if ($daemon->isQueueEmpty($w->getName())) {
                     continue;
                 }
                 $w->send(json_encode($daemon->unqueue($w->getName())));
             } catch (\Exception $e) {
                 $daemon->error($e);
             }
         }
     }
     return $this;
 }
 /**
  * @param $name
  * @param InputInterface  $input
  * @param OutputInterface $output
  *
  * @return Daemon
  */
 protected function createDaemon($name, InputInterface $input, OutputInterface $output)
 {
     $that = $this;
     $daemon = new Daemon($name);
     $daemon->onStartup(function (Daemon $daemon) {
         $daemon->log('<info>%s daemon started.</info>', [ucfirst($daemon->getName())]);
         unset($data);
     });
     $daemon->registerLogger(function ($text, $args) use($that, $output) {
         $that->log($output, array_merge([$text], $args));
     });
     $daemon->onError(function (\Exception $e, Daemon $daemon) {
         $daemon->logException($e);
     });
     unset($input);
     return $daemon;
 }