我如何重新启动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

实体经理在一段时间内工作后关闭。我想我需要重新开始。但是我无法在代码中做到这一点。但是,当主管重新启动时,一切都会开始工作。我该如何解决这个问题,因为我从一开始就不能总是重新启动主管。

我正在写下示例过程。

<?php
namespace AppProcessor;
use AppEntityMainEvent;
use DoctrineORMEntityManagerInterface;
use InteropQueueMessage;
use InteropQueueContext;
use InteropQueueProcessor;
use EnqueueClientTopicSubscriberInterface;
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 "Successn";
            return self::ACK;
        } catch (Exception $e){
            echo ($e->getMessage())." n";
            return self::REJECT;
        }
    }
    public static function getSubscribedTopics()
    {
        return ['aFooTopic'];
    }
}

如果您要查看学说源 - 您会看到(1,2)EntityManager在事务上的某些例外情况下关闭。

这意味着如果您的EntityManager关闭 - 应用程序或数据库可能出现问题(例如,与数据库的连接丢失或存在一些数据不一致之处,依此类推)。从学说来源,您还可以看到(1,2)在EntityManager关闭的情况下,抛出了例外,因此,您应该在关闭后立即看到此例外情况。

当然,您应该做的第一件事是检查这些例外,以检查EntityManager关闭的原因,并在可能的情况下消除其原因。这是建议的。

没有内置的方式重新打开闭合EntityManager,但是由于"封闭"状态只是学说内的标志 - 您可以通过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

谢谢

我相信您正在寻找的是顾问库的学说纳克延迟。

这是services.yaml配置,您需要启用以下内容:

services:
    app.enqueue.doctrine_ping_connection_extension:
        class: 'EnqueueBundleConsumptionExtensionDoctrinePingConnectionExtension'
        tags:
            - { name: 'enqueue.consumption.extension', priority: 10, client: 'all' }

相关内容

最新更新