2016-11-30 95 views
0

我正在使用grails「Promise」API來運行線程。在grails中運行線程groovy

線程正在執行以下操作

csv.splitEachLine(',') { row -> 
       insertRecord = Code.findByAni(row[0]) ?: new SurveyProActive(
         cid: row[1], 
         ani: row[0], 
         data_time: new Date(), 
         dnis: Code2.findById((Long) row[2])?.dialNumber, 

       ).save(failOnError: true, flush: true) 
      } 
     } 

我只是沒有得到如何解決我所面臨的問題。

無論如何,我得到以下例外

ERROR org.grails.web.errors.GrailsExceptionResolver - HibernateException occurred when processing request: [POST] /Survey/proactiveSurvey - parameters: 
a: 17 
No Session found for current thread. Stacktrace follows: 
org.hibernate.HibernateException: No Session found for current thread 
at org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:116) 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687) 
at org.grails.orm.hibernate.HibernateSession.createQuery(HibernateSession.java:176) 
at org.grails.orm.hibernate.HibernateSession.createQuery(HibernateSession.java:170) 
at org.grails.datastore.gorm.finders.AbstractFindByFinder.buildQuery(AbstractFindByFinder.java:44) 
at org.grails.datastore.gorm.finders.AbstractFindByFinder$1.doInSession(AbstractFindByFinder.java:29) 
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:318) 
at org.grails.datastore.gorm.finders.AbstractFinder.execute(AbstractFinder.java:42) 
at org.grails.datastore.gorm.finders.AbstractFindByFinder.doInvokeInternal(AbstractFindByFinder.java:27) 
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:174) 
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:374) 
at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:173) 
at org.grails.datastore.gorm.GormEntity$Trait$Helper.staticMethodMissing(GormEntity.groovy:749) 
at com.ef.apps.pcs.SurveyController$_proactiveSurvey_closure4.doCall(SurveyController.groovy:334) 
at org.grails.plugins.web.async.WebRequestPromiseDecorator.invokeClosure(WebRequestPromiseDecorator.groovy:43) 
at org.grails.plugins.web.async.WebRequestPromiseDecorator$_decorate_closure1.doCall(WebRequestPromiseDecorator.groovy:30) 
at groovyx.gpars.group.PGroup$3.call(PGroup.java:289) 
at groovyx.gpars.group.PGroup$4.run(PGroup.java:313) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
+0

你是如何制定你的承諾的? 'Promises.task {}'或'Domain.async.task {}' –

+0

Promise.task {//我的代碼 } –

回答

1

時退房「多個異步調用格姆」一節在這裏:http://docs.grails.org/latest/guide/async.html#asyncGorm。它說Domain.async.task{}處理將新會話綁定到異步線程,而Promises.task不會。

如果你不能使用Domain.async.task{}你也可以嘗試Domain.withNewSession{}方法。