/** * @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; }