我使用Grails GPaars创建一个异步块。

在BuildConfig中:

compile 'org.codehaus.gpars:gpars:1.2.1'
compile 'org.codehaus.jsr166-mirror:jsr166y:1.7.0'

我定义了一个助手类:
class TaskService {

  private ForkJoinPool pool = new ForkJoinPool()

  /**
   * Executes the given closure in a new thread.
   * @param args is a map of arguments to be used in the async closure.
   * @return
   */
  def executeAsync(args, closure = null) {
    if(!closure) {
      closure = args
      args = null
    }

    GParsPool.withExistingPool(pool) { closure.callAsync(args) }
  }
}

现在在 Controller 中执行以下操作:
TrackingEmail tEmail = TrackingEmail.get(trackingEmailId)
Device targetDevice = tEmail.device

前者的device是从TrackingEmail对象中检索的。

现在,我尝试在异步块中执行相同的操作:
taskService.executeAsync(trackingEmailId: trackingEmailId) { data ->
   TrackingEmail tEmail = TrackingEmail.get(data.trackingEmailId)
   Device targetDevice = tEmail.device
}

在此异步块中,仅tEmail从数据库中检索。第二行不执行。

如何在异步块中获取关系对象?

最佳答案

我认为您不应该直接将GPar用于GORMing。在这种情况下,您必须自己处理事务/ session :

 taskService.executeAsync(trackingEmailId: trackingEmailId) { data ->
   Device.withTransaction{ tx ->
     TrackingEmail tEmail = TrackingEmail.get(data.trackingEmailId)
     Device targetDevice = tEmail.device
   }
}

在频繁进行并行调用的情况下,这将使您的性能下降。

我建议看一下Asynchronous Programming in Grails,它使用扩展的GPar

07-28 01:20