我们在使用 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 网络流用户有关......
谢谢你的建议,马特奥