<?php include __DIR__ . './../vendor/autoload.php'; use Kemer\Amqp; $broker = new Amqp\Broker("rabbit.docker", 5672, 'guest', 'guest'); $dispatcher = new Amqp\Dispatcher(); $dispatcher->addSubscriber(new Amqp\Facade\PostponeSubscriber($broker)); $dispatcher->addSubscriber(new Amqp\Facade\DeadLetterSubscriber($broker)); $dispatcher->addListener("#", new Amqp\Publisher\QueuePublisher($broker), 1000); $dispatcher->addListener("#", new Amqp\Publisher\ExchangePublisher($broker), 1001); // Add event listeners $dispatcher->addListener('kernel.message', [new App\Listener(), "onMessage"]); $dispatcher->addListener("kernel.*", [new App\Listener(), "onKernel"]); $dispatcher->addListener('kernel.#', [new App\Listener(), "onAll"]); // Add event subscriber $dispatcher->addSubscriber(new App\Subscriber()); // Send discover request $dispatcher->dispatch("some-kernel", new Amqp\PublishEvent()); $consumer = new Amqp\Consumer($dispatcher); // Listen on named queue $consumer->listen($broker->declareQueue(AMQP_DURABLE, "error-queue")); // Listen on existing shared queue (load balanced) $consumer->listen($broker->declareQueue(AMQP_PASSIVE, "existing-queue"));
//$consumer->listen($queue, $exchange); /** * Error handling * You can register listener to `kemer.error` event to handle exceptions. * Add Monolog to log everything */ $dispatcher->addSubscriber(new AmqpAddons\MonologSubscriber($logger = new Monolog\Logger("AMQP"))); $logger->pushHandler($handler = new Monolog\Handler\ErrorLogHandler()); $handler->setFormatter(new Monolog\Formatter\LineFormatter($output = "[31m %level_name%[32m %message%[36m %context% [0m", $dateFormat = "g:i" . false, false)); $dispatcher->addSubscriber(new AmqpAddons\Command\QueueGetCommand($broker, $logger)); /** * postpone message on RuntimeException */ $dispatcher->addListener('kemer.error', function (GenericEvent $event, $eventName, $dispatcher) { if ($event["error"] instanceof \RuntimeException) { $dispatcher->dispatch(AmqpAddons\AddonsEvent::POSTPONE, $event->getSubject()); } }, -1); /** * reject message + requeue (if not requeued before) on error */ $dispatcher->addListener('kemer.error', function (GenericEvent $event, $eventName, $dispatcher) { $subject = $event->getSubject(); if (!$subject->isConsumed()) { $subject->reject($subject->isRedelivery() ? false : AMQP_REQUEUE); } }, -2); /** * Catch ConsumerException here to get last consumed event */ try {