2013-01-05 17 views
2

我们面临一个奇怪的行为在我们的Grails应用程序,其使用Web流量2.0.0插件(基本上是从Spring Web Flow的2.0.8.RELEASE) 。我们有时会收到LockTimeoutException这是由谁是通过我们的网络流量会在用户解雇;这通常会导致服务器停机。的Grails + Spring Web Flow的 - 无法获取对话锁(LockTimeoutException)

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

此行为可能也实现了与Next按钮“疯狂”点击,而计算需要更短的时间(可以说5秒)。在足够次数的点击之后,最新的请求/线程将需要等待超过30秒,因此将失败。 (我认为这是我们的生产情况,因为我们的计算应该采取非常短的时间,想象一下,谁在点击想疯了:-)住院用户

我的问题是:

有没有什么标准的方法如何解决这个问题呢?

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

有没有预防的服务器下去的?

  • 当我测试了它在本地(与Thread.sleep()方法),它并没有往下走,只是在生产

我认为这个问题是不相关的只是Grails的网络流量用户也Spring Web Flow的用户...

感谢您的任何建议, 刁

回答

2

我建议禁用[下一页]第一次点击后按钮。其他解决方案(如incraesing LOCKTIMEOUT将postpoone较长时间问题(例如,没有30秒,但60秒等)。禁用[下一页]将是完美的解决方案(虽然它只是一种解决方法,而不是在服务器端真正的解决方案)。