<?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"));
/** * 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 { $consumer->listen($queue, $exchange); } catch (Amqp\Exceptions\ConsumerException $e) { $event = $e->getEvent(); if (!$event->isConsumed()) { $event->reject($event->isRedelivery() ? false : AMQP_REQUEUE); } } catch (Amqp\Exceptions\NotConsumedException $e) { $logger->info(sprintf("%s@%s NOT FOUND \n", $e->getEvent()->getExchangeName(), $e->getEvent()->getRoutingKey())); $e->getEvent()->reject(false); }