【问题标题】:Grails Quartz & threads inside service服务内部的 Grails Quartz 和线程
【发布时间】:2012-09-10 02:39:40
【问题描述】:

我有一个关于 Quartz 和在 Service 类中运行线程的问题。

我之前的问题得到了回答:Grails background process,但是我还有另一个问题。

设置:我有一个设置为运行服务的作业,它运行良好。但是在服务类中,我有一个可以并行运行的算法。

问题: 通常我会以以下非常简单的方式将代码设置为并行运行:

Item.each {
   Thread.start {
      do some calculations here    
      write to DB
   }
}

但是,由于我的代码需要写入数据库并且我需要利用域类,因此我的代码会刹车。 Hibernate 抱怨线程无权访问某些东西。

我不确定为什么我不能在 Service 类中使用线程并利用域类。有人可以帮我解决这个难题吗? 我需要以特殊方式创建线程吗?可能我不应该在 Service 类中创建线程(因为 Service 类似乎在线程中运行)?我需要将我的代码移动到 Job 类中吗?

请帮忙。

谢谢。

【问题讨论】:

  • 尝试查看执行器插件并将对服务的调用包装为:runAsync { service.serviceMethod() }
  • 进一步了解@Steve 所说的,默认情况下,新线程不会附加休眠会话(使用休眠需要它)-因此您看到的错误.执行器插件为您管理附加休眠会话(事实上,石英插件也是如此)。

标签: grails groovy quartz-scheduler


【解决方案1】:

默认情况下,新线程不会绑定 Hibernate Session。要附加休眠会话,请尝试以下操作:

Item.each {
    Thread.start {
        Item.withTransaction {
            do some calculations here    
            write to DB
        }
    }
}

您还可以查看GPars 以获得易于使用的并行化框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多