Aşağıdaki yöntemler symfony RabbitMQ consumer içinde oluşan hataları en uygun şekilde işlemek için kullanılabilir. Şu an için sadece try ... catch bölümüne odaklanın. Örneğimiz RabbitMqBundle kullanıyor.


Consumer


namespace Application\FrontendBundle\Consumer;

use Application\FrontendBundle\Entity\OrderLog;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
use PhpAmqpLib\Exception\AMQPBasicCancelException;
use PhpAmqpLib\Message\AMQPMessage;
use Symfony\Component\HttpKernel\Log\LoggerInterface;

class OrderCreateConsumer implements ConsumerInterface
{
private $entityManager;
private $logger;

public function __construct(
EntityManagerInterface $entityManager,
LoggerInterface $logger
) {
$this->entityManager = $entityManager;
$this->logger = $logger;
}

public function execute(AMQPMessage $message)
{
$body = json_decode($message->body, true);

try {
$this->log($body);

echo sprintf('Order create - ID:%s @ %s ...', $body['order_id'], date('Y-m-d H:i:s')).PHP_EOL;
} catch (Exception $e) {
// Option 1:
// $this->logger->error(json_encode($message));

// Option 2:
// throw new AMQPBasicCancelException(json_encode($message));

// Option 3:
// return false;

// Option 4:
// return ConsumerInterface::MSG_REJECT_REQUEUE;

// Option 5:
// return ConsumerInterface::MSG_REJECT;
}
}

private function log($message)
{
$log = new OrderLog();
$log->setAction(OrderLog::CREATE);
$log->setMessage($message);

$this->entityManager->persist($log);
$this->entityManager->flush();
}
}

Seçeneklerin açıklamaları


Varsayalım ki terminalde $ app/console rabbitmq:consumer -m 100 order_create komutu ile iki tane consumer çalıştırdınız.



Seçenek


Malum nedenlerden dolayı, size Option 1'i seçmenizi tavsiye ederim. Option 5 ve Option 1 aslında aynı şey ama aralarındaki tek fark, Option 5 log yazmaz.


Not: Eğer bu bir gerçek hayat senaryosu olsaydı, size RabbitMQ'nun Dead Letter Exchange özelliğini kullanıp, Option 1 ve Option 5'i uygulamanızda birlikte kullanmanızı tavsiye ederdim. Bu durumda Option 1 log yazar ve Option 5 ise mesajı Dead Letter Exchange'e yönlendirir. Daha sonra mesajı kontrol edip, konuyla ilgili birşeyler yapabiliriz. Bu blogda konuyla ilgili tam bir örneğimiz mevcut.