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中的异步内容。但这是另一个问题