grails 3.0 控制器中的异步重定向失败。
以下是示例控制器片段;
import static grails.async.Promises.*
class WaitController {
def index() {
if (request.asyncContext) {
render 'index sync'
} else {
task {
render 'index async'
}
}
}
def redirectSync() {
redirect action:'index'
// works very well
}
def redirectAsync() {
task {
try {
redirect action:'index'
} catch (Exception ex) {
log.error('async redirect', ex)
}
}
}
}
异常的堆栈跟踪是这样的;
ERROR grails.app.controllers.grails3.event.driven.WaitController - async redirect
org.hibernate.HibernateException: No Session found for current thread
at org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:117) ~[grails-datastore-gorm-hibernate4-4.0.6.RELEASE.jar:na]
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.grails.orm.hibernate.SessionFactoryProxy.getCurrentSession(SessionFactoryProxy.java:148) ~[grails-datastore-gorm-hibernate4-4.0.6.RELEASE.jar:na]
at org.grails.orm.hibernate.support.FlushOnRedirectEventListener.responseRedirected(FlushOnRedirectEventListener.java:38) ~[grails-datastore-gorm-hibernate4-4.0.6.RELEASE.jar:na]
at grails.web.mapping.ResponseRedirector.redirectResponse(ResponseRedirector.groovy:101) ~[grails-web-url-mappings-3.0.8.jar:3.0.8]
at grails.web.mapping.ResponseRedirector.redirect(ResponseRedirector.groovy:79) ~[grails-web-url-mappings-3.0.8.jar:3.0.8]
at grails.artefact.controller.support.ResponseRedirector$Trait$Helper.redirect(ResponseRedirector.groovy:119) ~[grails-plugin-controllers-3.0.8.jar:3.0.8]
at sun.reflect.GeneratedMethodAccessor366.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201510201305]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:151) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:102) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:214) [groovy-2.4.4.jar:2.4.4]
at grails3.event.driven.WaitController.grails_artefact_Controllertrait$super$redirect(WaitController.groovy) ~[main/:na]
at sun.reflect.GeneratedMethodAccessor380.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201510201305]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:71) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) [groovy-2.4.4.jar:2.4.4]
at grails.artefact.Controller$Trait$Helper.redirect(Controller.groovy:241) ~[grails-plugin-controllers-3.0.8.jar:3.0.8]
at sun.reflect.GeneratedMethodAccessor365.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201510201305]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:151) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) [groovy-2.4.4.jar:2.4.4]
at grails3.event.driven.WaitController.redirect(WaitController.groovy) ~[main/:na]
at sun.reflect.GeneratedMethodAccessor364.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201510201305]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166) [groovy-2.4.4.jar:2.4.4]
at grails3.event.driven.WaitController$_redirectAsync_closure2.doCall(WaitController.groovy:21) ~[main/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201510201305]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:201510201305]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201510201305]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:57) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) [groovy-2.4.4.jar:2.4.4]
at org.grails.plugins.web.async.WebRequestPromiseDecorator.invokeClosure(WebRequestPromiseDecorator.groovy:43) [grails-plugin-async-3.0.8.jar:3.0.8]
at org.grails.plugins.web.async.WebRequestPromiseDecorator$_decorate_closure1.doCall(WebRequestPromiseDecorator.groovy:30) [grails-plugin-async-3.0.8.jar:3.0.8]
at sun.reflect.GeneratedMethodAccessor285.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201510201305]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) ~[groovy-2.4.4.jar:2.4.4]
at groovy.lang.Closure.call(Closure.java:426) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:53) [groovy-2.4.4.jar:2.4.4]
at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:105) [groovy-2.4.4.jar:2.4.4]
at com.sun.proxy.$Proxy74.get(Unknown Source) [na:na]
at reactor.rx.stream.SupplierStream$2.run(SupplierStream.java:82) [reactor-stream-2.0.3.RELEASE.jar:na]
at reactor.core.dispatch.AbstractLifecycleDispatcher$2.accept(AbstractLifecycleDispatcher.java:136) [reactor-core-2.0.3.RELEASE.jar:na]
at reactor.core.dispatch.AbstractLifecycleDispatcher.route(AbstractLifecycleDispatcher.java:159) [reactor-core-2.0.3.RELEASE.jar:na]
at reactor.core.dispatch.SingleThreadDispatcher$SingleThreadTask.run(SingleThreadDispatcher.java:79) [reactor-core-2.0.3.RELEASE.jar:na]
at reactor.core.dispatch.RingBufferDispatcher$3.onEvent(RingBufferDispatcher.java:156) [reactor-core-2.0.3.RELEASE.jar:na]
at reactor.core.dispatch.RingBufferDispatcher$3.onEvent(RingBufferDispatcher.java:153) [reactor-core-2.0.3.RELEASE.jar:na]
at reactor.jarjar.com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:128) [reactor-core-2.0.3.RELEASE.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65]
at java.lang.Thread.run(Thread.java:745)
似乎这与休眠会话问题有关,但没有 GORM,我不知道如何防止它。