【问题标题】:Symfony app stuck when getting EntityManagerSymfony 应用程序在获取 EntityManager 时卡住
【发布时间】:2018-05-03 03:32:56
【问题描述】:

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

当我刷新我的网络浏览器却发现它无限期加载时,我刚刚遇到了一个问题(首先在AJAX 中发现,但后来在正常请求中发现)。

它看起来并不明显,但是当我关闭也使用EntityManager 的后台Symfony 命令时,浏览器就会被解锁并继续请求。

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

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

  • 正在重启Apache
  • 重述RabbitMQ
  • 正在清除 RabbitMQ 队列
  • 对 web 和命令使用不同的 EntityManagers

我使用OldSoundRabbitMqBundle (link) 来促进两者之间的沟通。

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

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

这发生在开发盒上,我还没有在生产服务器上试一试,在我了解更多信息之前我也不会。

【问题讨论】:

    标签: symfony doctrine-orm rabbitmq entitymanager


    【解决方案1】:

    看来我误用了 Postgres 中的锁定机制。任务处理组件确实是一个长时间运行的任务,但鉴于它是 Symfony 命令,Doctrine 连接正在尽可能早地建立。

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

    这是根本原因。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多