2 回答
TA贡献1845条经验 获得超8个赞
只需在任何插入操作之前断开连接:
public function handle(…)
{
// your time-consuming business logic
// disconnect if needed
if (!$this->entityManager->getConnection()->ping()) {
$this->entityManager->getConnection()->close();
}
// save your work
$this->entityManager->flush();
}
TA贡献2037条经验 获得超6个赞
在阅读了我的中间件的代码后,尤其是这个块
https://github.com/symfony/symfony/blob/4.4/src/Symfony/Bridge/Doctrine/Messenger/DoctrinePingConnectionMiddleware.php
class DoctrinePingConnectionMiddleware extends AbstractDoctrineMiddleware
{
protected function handleForManager(EntityManagerInterface $entityManager, Envelope $envelope, StackInterface $stack): Envelope
{
$connection = $entityManager->getConnection();
if (!$connection->ping()) {
$connection->close();
$connection->connect();
}
if (!$entityManager->isOpen()) {
$this->managerRegistry->resetManager($this->entityManagerName);
}
return $stack->next()->handle($envelope, $stack);
}
}
我们可以看到我的处理程序在连接打开后立即被调用。这种行为应该可以工作,我认为是这样,但是 FFMPEG 可以在很长一段时间内使用相同的 RabbitMQ 消息工作。因此,将某些内容插入数据库的处理程序的最后一步可能会提供 mySQL 已消失错误或连接超时。
这就是为什么,我把这个片段放到一个方法中,没有调用处理程序,只包含与学说连接相关的代码,然后我在任何插入到我的数据库之前调用它,如下所示:
public function __invoke(AMQPvideoFFMPEG $message)
{
// reset connection if not found
$this->processService->testConnection();
$process = $this->processService->find($message->getProcess());
$this->renderServcie->updateQueue($process->getQueue(), "processing");
// some other stuff
}
testConnection() 方法在哪里
/**
* Reconnect if connection is aborted for some reason
*/
public function testConnection()
{
$connection = $this->entityManager->getConnection();
if (!$connection->ping()) {
$connection->close();
$connection->connect();
}
}
但在那之后我又尝试了另一个问题
不支持重置非惰性管理器服务。将“doctrine.orm.default_entity_manager”服务设置为惰性服务,并在您的 composer.json 文件中要求“symfony/proxy-manager-bridge”。
安装“symfony/proxy-manager-bridge”后,错误消失了。
到目前为止,还没有遇到连接超时。等着瞧。
- 2 回答
- 0 关注
- 160 浏览
添加回答
举报