Как перезапустить менеджер сущностей доктрины для Symfony 4.2?
Я использую Symfony версии 4.2 . Я использую другие пакеты, которые я пишу ниже.
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"enqueue/enqueue-bundle": "^0.9.7",
"enqueue/pheanstalk": "^0.9.7",
"friendsofsymfony/elastica-bundle": "^5.0",
"nelmio/cors-bundle": "^1.5",
"nesbot/carbon": "^2.10",
"symfony/console": "*",
"symfony/flex": "^1.1",
"symfony/framework-bundle": "*",
"symfony/orm-pack": "^1.0",
"symfony/serializer-pack": "^1.0",
"symfony/yaml": "*"
Я запускаю команду cosume с помощью супервизора. Я пишу настройки своего супервизора ниже.
[program:devlog-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/project-directory/bin/console enqueue:consume --setup-broker
autostart=true
autorestart=true
user=nginx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/project-directory/worker.log
Entity Manager закрывается после работы в течение определенного периода времени. Я думаю, что мне нужно начать снова. Но я не мог сделать это в коде. Но когда супервизор перезагружается, все начинает работать. Как я могу решить эту проблему, потому что я не могу всегда перезапускать супервизор с самого начала.
Я пишу пример процесса ниже.
<?php
namespace App\Processor;
use App\Entity\Main\Event;
use Doctrine\ORM\EntityManagerInterface;
use Interop\Queue\Message;
use Interop\Queue\Context;
use Interop\Queue\Processor;
use Enqueue\Client\TopicSubscriberInterface;
class FooProcessor implements Processor, TopicSubscriberInterface
{
protected $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function process(Message $message, Context $session)
{
try {
$event = new Event();
$event->setAction('example');
if (!$this->entityManager->isOpen()) {
echo "Entity Manger is closed...\n";
// here i need to restart the entity manager or another solution
}
$this->entityManager->persist($event);
$this->entityManager->flush();
$this->entityManager->clear();
echo "Success\n";
return self::ACK;
} catch (\Exception $e){
echo ($e->getMessage())." \n";
return self::REJECT;
}
}
public static function getSubscribedTopics()
{
return ['aFooTopic'];
}
}
2 ответа
Если вы посмотрите на источники Учения - вы увидите ( 1, 2), что EntityManager
закрыться в случае, если в контексте транзакции было сгенерировано исключение.
Это означает, что если ваш EntityManager
быть закрытым - возможно, что-то не так с приложением или базой данных (например, потеря связи с базой данных или некоторые несоответствия данных и т. д.). Из источников Доктрины вы также можете видеть ( 1, 2), что исключение выдается в случае EntityManager
закрытие, поэтому, просматривая ваши источники, вы должны увидеть, что это исключение отражается сразу после закрытия.
Конечно, первое, что вы должны сделать, это проверить эти исключения, чтобы выяснить причину вашего EntityManager
закройте и устраните причины для них, если это возможно. Это рекомендуемый способ.
Там нет встроенного способа повторно открыть закрыто EntityManager
, но так как "закрытое" состояние - это просто флаг внутри Doctrine - вы можете очистить его через Reflection
:
$reflection = new \ReflectionObject($this->entityManager);
$prop = $reflection->getProperty('closed');
$prop->setAccessible(true);
$prop->setValue($this->entityManager, false);
$prop->setAccessible(false);
но это "хакерский" способ, и я бы не советовал его, пока не понадобится.
Проблема была решена путем изменения настроек супервизора. Я пропустил настройку.
новая настройка супервизора
[program:devlog-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/project-directory/bin/console enqueue:consume --setup-broker --env=prod --no-debug --time-limit="now + 5 minutes"
autostart=true
autorestart=true
user=nginx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/project-directory/worker.log
Спасибо
Я считаю, что вы ищете DoctrinePingConnectionExtension для библиотеки постановки в очередь.
Вот конфигурация services.yaml, необходимая для включения этого:
services:
app.enqueue.doctrine_ping_connection_extension:
class: 'Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension'
tags:
- { name: 'enqueue.consumption.extension', priority: 10, client: 'all' }