2

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

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

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

我的问题是:

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

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

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

  • 当我在本地(使用 Thread.sleep())对其进行测试时,它并没有出现故障,只是在生产中

我认为这个问题不仅与 Grails 网络流用户有关,而且与 Spring 网络流用户有关......

谢谢你的建议,马特奥

4

1 回答 1

2

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

于 2013-01-05T15:01:51.653 回答