Grails + Spring Web Flow - 无法获取会话锁(LockTimeoutException)

时间:2013-01-05 09:35:28

标签: spring grails spring-webflow grails-2.0

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

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

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

我的问题是:

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

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

是否有任何阻止服务器停机的行为?

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

我认为这个问题与Grails网络流量用户以及Spring网络流量用户无关......

感谢您的任何建议, 刁

1 个答案:

答案 0 :(得分:2)

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