Grails:检测服务器端的请求中止(ajax,escape,reload)

时间:2012-07-09 10:01:54

标签: ajax grails request server-side abort

我有一个grails-application,它在几个边缘使用ajax。

我通过ajax触发大型计算(client -> controller -> service -> controller -> client),有时在所有当前运行的请求上调用abort()。 (例如,如果用户更改了某些参数)

现在的问题是,当我在我的ajax请求上调用abort()时,这些请求确实在客户端停止(完美!),但是服务器一直在计算那些被中止的请求 - 它不知道用户中止和进一步处理无用

我搜索了一个方法/插件等告诉服务器“嘿,停止此请求,不再需要了”,但没有找到解决方案。

关于我如何解决这个或其他人如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:0)

我怀疑有更简单的方法,而不是向服务器发送另一个ajax请求,并让控制器“停止”服务中的预览处理,例如。

请检查此问题:How to cancel ajax request that has run (on server side)

答案 1 :(得分:0)

正如其他人所说,没有太多办法可以让服务器停止处理请求。您可以施加某些控制权的唯一地方就是您处理长时间运行计算的服务。

一个想到的解决方案是计算服务检查某种类型的标志,告诉它中止,如果它发现它被设置,那么它只是立即返回或返回一些小的垃圾值,因为客户不再听了。

由于默认情况下服务是事务安全的(我认为),您必须小心以与事务无关的方式设置标志,这意味着会话和数据库(假设您使用的是事务关系数据库) )是禁止的,因为您的服务不会看到后续“停止”请求所做的更改。相反,像Redis这样的东西可能是理想的,因为它是一个外部的,非事务性的,非常快速的键值数据存储。

作为示例“架构”,您基本上会有一个“停止”操作,为该特定用户或会话设置redis密钥,告知计算停止。然后,您的计算服务会在运行时检查该密钥,并在发现密钥时停止处理。

还有其他(也许是更好的)架构可以让你做这类事情,但鉴于你当前的系统,我认为这将是最简单的。