2015-09-17 2 views
0

Я использую Grails GPaars для создания асинхронного блока.Соотношение объектов GORM не загружается в асинхронном блоке

В 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) } 
    } 
} 

Теперь в контроллере я:

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 извлекается из базы данных. Вторая строка не выполняется.

Как получить реляционные объекты в асинхронном блоке?

ответ

2

Я не думаю, что вы должны использовать GPars для GORMing напрямую. В этом случае вам придется позаботиться о сделках/Sessions себя:

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

и что даст вам плохой Performace в случае частых параллельных вызовов.

Я рекомендую взглянуть на Asynchronous Programming in Grails, которая использует расширенный GPars

+0

Оп! Я успешно использовал grails.async.Promises.task. И это требует .withTransaction(). –

Смежные вопросы