Ejemplo n.º 1
0
<?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"));
Ejemplo n.º 2
0
//$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 = " %level_name% %message% %context% ", $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 {