Как перезапустить менеджер сущностей доктрины для Symfony 4.2? - PullRequest
0 голосов
/ 24 февраля 2019

Я использую 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

Менеджер сущностей закрывается после работы в течение определенного периода времени.Я думаю, что мне нужно начать снова.Но я не мог сделать это в коде.Но когда супервизор перезагружается, все начинает работать.Как я могу решить эту проблему, потому что я не могу всегда перезапускать супервизор с самого начала.

Я пишу пример процесса ниже.

<?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 ]

0 голосов
/ 26 февраля 2019

Проблема была решена путем изменения настроек супервизора.Я пропустил настройку.

новая настройка супервизора

[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

Спасибо

0 голосов
/ 24 февраля 2019

Если вы загляните в источники Doctrine - вы увидите ( 1 , 2 ), что EntityManager закрывается в случае, если в контексте транзакции было сгенерировано исключение.

Это означает, что если ваш EntityManager будет закрыт - возможно, что-то не так с приложением или базой данных (например, потеря соединения с базой данных или некоторая несогласованность данных и т. Д.).Из источников Doctrine вы также можете увидеть ( 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);

но это "хакерский" способ, и я бы не советовал его, пока это абсолютно необходимо.

...