Symfony应用程序在获取EntityManager时卡住

Jov*_*vic 5 entitymanager rabbitmq symfony doctrine-orm

我正在开发一个具有Web组件(通过浏览器访问)和后台任务处理组件的应用程序,Web组件将一些运行时间长的东西委托给该应用程序。

当我刷新Web浏览器时才发现它无限期加载(刚发现是AJAX,但后来出现在正常请求中),这只是一个问题。

它看起来似乎并不很明显,但是一旦我关闭了后台Symfony命令,该命令也利用EntityManager了浏览器,它就会被解除阻止并继续进行请求。

我的应用程序用于RabbitMQ存储由Web组件发布的作业请求。该Symfony命令使用相同的“主干”来创建RabbitMQ使用者并接受这些作业。

我试过了,没有任何结果:

  • 重新开始 Apache
  • 重述 RabbitMQ
  • 清除RabbitMQ队列
  • EntityManagers对Web和命令使用不同

我使用OldSoundRabbitMqBundlelink)促进两者之间的通信。

无论调用什么操作,Web组件都会卡住(与RabbitMQ生产者无关)。

有人偶然发现类似问题吗?

这发生在开发箱上,我还没有在生产服务器上试用它,直到我找到更多有关此事的机会。

Jov*_*vic 4

看来我滥用了 Postgres 中的锁定机制。事实上,任务处理组件是一个长时间运行的任务,但考虑到它是 Symfony 命令,Doctrine 连接正在尽早建立。

现在是棘手的部分:我使用该LOCK TABLE语句锁定了一些表,使其远离并发访问(EXCLUSIVE类型)。在不关闭连接(不是实体管理器)的情况下,这些锁将保持不变,直到我重新启动命令(每 10 个任务)。

这是根本原因。

我仍在调查一些边缘情况,但自从我转向咨询锁定后,我就没有更多的锁定了。