【问题标题】:Cancel ongoing Service and Job - grails取消正在进行的服务和作业 - grails
【发布时间】:2013-02-07 05:39:48
【问题描述】:

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

class SomeService {
    static transactional = true
    
    def someMethod() {
        //some business logic here 
    
        SomeTriggeredJob.triggerNow((java.util.LinkedHashMap)[params: queriedParams]
    }
}

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

【问题讨论】:

    标签: grails service jobs


    【解决方案1】:
    1. 让用户发送取消请求;
    2. 在服务器端在数据库或会话中设置一个标志,您的作业可以访问该标志;
    3. 作业应首先读取该值,并根据该值 - 继续或取消。

    【讨论】:

      【解决方案2】:

      如果用户取消进程并将标志保存在会话或数据库中,则将某些标志设置为 false。同时,在您正在运行的方法/作业中,放置一个循环并每次检查标志。所以,如果你在标志中得到错误,下次不要运行该作业。 例如,如果用户取消设置

      session.cancelFlag = false
      

      在你的工作中,做一些类似的事情

      def jobMethod(){
          someLoop.each{
              if(session.cancelFlag){
                  Do your work here !
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        要取消一个服务的事务上下文,您可以启动一个抛出服务,如果您需要执行此服务的传出,您可以将其封装在一个方法中。

        serviceExample.doCancel()
        

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

        Grails Documentation - Services

        【讨论】:

          猜你喜欢
          • 2022-11-04
          • 2018-01-07
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 1970-01-01
          • 2016-06-25
          • 1970-01-01
          相关资源
          最近更新 更多