01/02/2016 - RABBITMQ, SYMFONY
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.
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();
}
}
Varsayalım ki terminalde $ app/console rabbitmq:consumer -m 100 order_create
komutu ile iki tane consumer çalıştırdınız.
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.