取消正在进行的服务和工作 - grails

时间:2013-02-07 05:39:48

标签: grails service jobs

我只是在考虑是否可以取消或停止正在进行的服务或工作?例如,我有一个代码调用服务中的方法,然后用户突然想要取消所述操作。是否有可能停止或回滚服务取消之前所做的更改,因为它是事务性的?假设我有这段代码:

class SomeService {
    static transactional = true

    def someMethod() {
        //some business logic here 

        SomeTriggeredJob.triggerNow((java.util.LinkedHashMap)[params: querriedParams]
    }
}

有没有办法取消它,如果它已经在执行?

3 个答案:

答案 0 :(得分:0)

  1. 让用户发送取消请求;
  2. 服务器端的
  3. 在您的作业可以访问的DB或会话中设置一个标志;
  4. 作业应该首先读取该值并依赖于它 - 继续或取消。

答案 1 :(得分:0)

如果用户取消进程并将标志保存在会话或数据库中,请将某些标志设置为false。而在您正在运行的方法/作业中,放置一个循环并每次检查该标志。所以,如果你在旗帜中弄错了,那么下次不要运行这份工作。 例如,如果用户取消设置

session.cancelFlag = false

在你的工作中,做一些像

这样的事情
def jobMethod(){
    someLoop.each{
        if(session.cancelFlag){
            Do your work here !
        }
    }
}

答案 2 :(得分:0)

要取消一个服务的事务上下文,您可以启动一个投入服务,如果您需要执行此服务的传出,您可以在方法中填充它。

serviceExample.doCancel()

*“结果是所有方法都包含在事务中,并且如果方法抛出运行时异常(即扩展RuntimeException的异常)或Error,则会发生自动回滚。事务的传播级别默认设置为PROPAGATION_REQUIRED 。 已检查的异常不会回滚事务。尽管Groovy模糊了已检查和未检查异常之间的区别,但Spring并未意识到这一点,并且使用了其默认行为,因此理解已检查和未检查异常之间的区别非常重要。“*

Grails Documentation - Services