Grails异步请求与HttpSession的行为异常
我有一个简单的控制器,它有一个用于长时间运行任务的操作和一个用于检查长时间任务状态的操作:Grails异步请求与HttpSession的行为异常,grails,asynchronous,httpsession,Grails,Asynchronous,Httpsession,我有一个简单的控制器,它有一个用于长时间运行任务的操作和一个用于检查长时间任务状态的操作: class AsyncController { def index() { } def longTerm() { session.longTerm = 0 session.longTermDone = false task { for (int i; i < 10; i++ ) {
class AsyncController {
def index() { }
def longTerm() {
session.longTerm = 0
session.longTermDone = false
task {
for (int i; i < 10; i++ ) {
try {
sleep(3000) //NOT WORKING
println " TASK: sessionID ${session.id} value ${session.longTerm++}"
//sleep(3000) //WORKING
} catch (e) {
println(e.class.name)
}
}
session.longTermDone = true
}
render(text: [] as JSON, status: 200)
}
def longTermStatus() {
println "STATUS: sessionID ${session.id} value ${session.longTerm}"
render(text: [successCount: session.longTerm, done: session.longTermDone] as JSON, status: 200)
}
}
类异步控制器{
def index(){}
def长期{
session.longTerm=0
session.longTermDone=false
任务{
for(int i;i<10;i++){
试一试{
睡眠(3000)//不工作
println“任务:sessionID${session.id}值${session.longTerm++}”
//睡眠(3000)//工作
}捕获(e){
println(e.class.name)
}
}
session.longTermDone=true
}
呈现(文本:[]为JSON,状态:200)
}
def长期状态(){
println“状态:sessionID${session.id}值${session.longTerm}”
将(文本:[successCount:session.longTerm,done:session.longTermDone]呈现为JSON,状态:200)
}
}
在长期行动中,HttpSession存在一个问题
如果任务闭包中的第一行代码正在使用HttpSession执行某些操作,则其余代码工作正常。但是,如果第一行正在执行其他操作,则当我尝试访问session.id时,会收到NullPointerException
工作代码示例位于
有人知道Grails为什么会这样吗?这里的问题似乎是您在
任务
块之外执行render()
。如果在tasks
块内移动render()
,则NullPointerException
将消失
我认为这是因为render()
完成了请求,而您绕过了Servlet 3异步支持。您需要从操作返回一个承诺,而task()
就是这样做的
不幸的是,render()
似乎无法处理Grails2.3.7或2.3.10中的异步内容。但这是另一个问题