交易结束后执行任务 - Grails

时间:2017-11-28 18:39:01

标签: grails transactions

我需要在grails事务结束后执行一些任务。我不是在寻找Hibernate的提交,而不是那个,我需要一个在服务事务结束后调用的方法。

有什么办法吗?我已经阅读了文档,但我找不到任何内容,只有像afterUpdate或afterCommit这样的正常事件。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以向当前会话添加事件侦听器

sessionFactory.currentSession.addEventListener(...)

class MyListener extends BaseSessionEventListener {
    @Override
    void transactionCompletion(boolean successful) {

    }
}

您只需通过参数验证交易是否成功。还要理解,如果单个会话中有多个事务,则将为每个事务调用侦听器。

答案 1 :(得分:-1)

这实际上取决于你想要做什么。最好的办法是在服务上调用@Transactional方法,然后在返回时运行事务后需要执行的代码。

另一种选择,如果您只想分离一些简单的任务,可以使用:

new java.util.Timer().runAfter(1000) { //time in milliseconds
  //code to run here
}

这只是一个分离新线程的快捷方式,并在(在上面的例子中)1秒后运行闭包体...我相信闭包仍然可以访问注入的grails对象,但是无法访问会话。我会仔细检查一下。我已在多个地方使用此功能来发送通知,这些通知需要等到事务处理中的某些处理结束后才会发送。