获取EntityManager时,Symfony app卡住了

时间:2017-11-19 23:26:18

标签: symfony doctrine-orm rabbitmq entitymanager

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

当我刷新我的网络浏览器时,我发现它只是无限期地加载(首先在AJAX中发现,但在正常请求中稍后发现)。

它看起来并不明显,但只要我关闭后台Symfony命令,该命令也使用EntityManager,浏览器就会被取消阻止并继续处理请求。

我的应用使用RabbitMQ来存储由网络组件发布的作业请求。 Symfony命令使用相同的"骨干"创建RabbitMQ消费者并消费这些工作。

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

  • 重新启动Apache
  • 重申RabbitMQ
  • 清除RabbitMQ队列
  • 为网站和命令使用不同的EntityManagers

我使用OldSoundRabbitMqBundlelink)来促进这两者之间的沟通。

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

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

这种情况发生在开发框中,我还没有在生产服务器上进行旋转,直到我发现更多相关内容时才会这样做。

1 个答案:

答案 0 :(得分:3)

似乎我误用了Postgres中的锁定机制。事实上,任务处理组件是一个长期运行的任务,但鉴于它是Symfony命令,Doctrine连接正在尽早建立。

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

这是根本原因。

我仍在调查一些边缘案例,但自从我转移到咨询锁定后,我没有更多的锁定。