3

我有一个在多个边缘使用 ajax 的 grails 应用程序。

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

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

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

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

4

2 回答 2

0

正如其他人所说,要让服务器停止处理请求,您无能为力。您可以施加一些控制的唯一地方是在您的服务中处理长时间运行的计算。

想到的一种解决方案是计算服务检查某种指示它中止的标志,如果它发现它被设置,那么它会立即返回或返回一些小的垃圾值,因为客户端反正已经不听了。

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

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

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

于 2012-07-09T17:42:20.320 回答
0

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

检查这个问题:如何取消已运行的 ajax 请求(在服务器端)

于 2012-07-09T10:24:25.973 回答