我正在开发一个具有Web组件(通过浏览器访问)和后台任务处理组件的应用程序,Web组件会委托一些长时间运行的东西。
当我刷新我的网络浏览器时,我发现它只是无限期地加载(首先在AJAX
中发现,但在正常请求中稍后发现)。
它看起来并不明显,但只要我关闭后台Symfony
命令,该命令也使用EntityManager
,浏览器就会被取消阻止并继续处理请求。
我的应用使用RabbitMQ
来存储由网络组件发布的作业请求。 Symfony
命令使用相同的"骨干"创建RabbitMQ
消费者并消费这些工作。
我尝试过,没有任何结果:
Apache
RabbitMQ
RabbitMQ
队列EntityManagers
我使用OldSoundRabbitMqBundle
(link)来促进这两者之间的沟通。
无论调用什么操作(与RabbitMQ
生产者无关),Web组件都会卡住。
有没有人偶然发现类似问题?
这种情况发生在开发框中,我还没有在生产服务器上进行旋转,直到我发现更多相关内容时才会这样做。
答案 0 :(得分:3)
似乎我误用了Postgres中的锁定机制。事实上,任务处理组件是一个长期运行的任务,但鉴于它是Symfony命令,Doctrine连接正在尽早建立。
现在是棘手的部分:我使用LOCK TABLE
语句将某些表锁定在远离并发访问(EXCLUSIVE
类型)的位置。在没有关闭连接(不是实体管理器)的情况下,这些锁保持不变,直到我重新启动命令(每第10个任务)。
这是根本原因。
我仍在调查一些边缘案例,但自从我转移到咨询锁定后,我没有更多的锁定。