【问题标题】:Grails + Spring Web Flow - Unable to acquire conversation lock (LockTimeoutException)Grails + Spring Web Flow - 无法获取对话锁(LockTimeoutException)
【发布时间】:2012-12-19 16:17:36
【问题描述】:

我们在使用 Web Flow 2.0.0 插件(基本上是 Spring Web Flow 2.0.8.RELEASE)的 Grails 应用程序中遇到了一个奇怪的行为。我们有时会收到 LockTimeoutException,这是由正在浏览我们网络流程的用户触发的;这通常会导致服务器宕机。

在阅读了有关 Spring Web Flow 的更多信息后,我意识到问题可能出在长时间运行的任务中(我已经使用 Thread.sleep(30000) 对此进行了测试)。如果用户在第一次计算耗时较长(默认超过 30 秒)时单击“下一步”按钮两次,则无法满足第二次请求(无法锁定流),因此会抛出此异常。

这种行为也可以通过“疯狂”单击下一步按钮来实现,而计算时间更短(比如说 5 秒)。在足够多的点击后,最新的请求/线程需要等待超过 30 秒,因此会失败。 (我认为这是我们在生产中的情况,因为我们的计算应该需要很短的时间;想象一下疯狂点击的住院用户:-)

我的问题是:

有什么标准方法可以解决这个问题吗?

  • 例如,如果第一个请求未完成,则以某种方式丢弃第二个请求? - 这会导致死锁吗?
  • 还是在第一次点击后禁用“下一步”按钮?
  • 我认为增加锁定超时时间只会推迟这个麻烦...

有没有防止服务器宕机的措施?

  • 当我在本地(使用 Thread.sleep())测试它时,它并没有停止,只是在生产中

我认为这个问题不仅适用于 Grails 网络流用户,也适用于 Spring 网络流用户......

感谢您的任何建议, 马特奥

【问题讨论】:

    标签: spring grails spring-webflow grails-2.0


    【解决方案1】:

    我建议在第一次单击后禁用 [下一步] 按钮。其他解决方案(如增加 LockTimeout 会将该问题推迟更长的时间(例如,不是 30 秒,而是 60 秒等)。禁用 [Next] 将是完美的解决方案(尽管它只是一种解决方法,而不是服务器端的真正解决方案)。

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      相关资源
      最近更新 更多