如何在groovy线程中使用session

时间:2013-09-12 16:35:19

标签: grails groovy

我是Groovy的新手。我想在Groovy线程中更新会话变量。 我不能把真正的代码放在一边,所以我要放样本代码。

public updatename()
    {
        println(session["firstname"]);
        Thread.start
        {
                session["firstname"] = "atul";
                println(session["firstname"]);         
        }
    }

我能够在线程之外访问会话变量,但是我在线程内的会话中遇到以下错误

  

“错误java.lang.IllegalStateException:找不到线程绑定的请求:   您是指实际网络之外的请求属性吗?   请求,或处理最初接收之外的请求   线?如果您实际上是在Web请求中操作而仍然   收到此消息,您的代码可能正在运行   DispatcherServlet / DispatcherPortlet:在这种情况下,请使用   RequestContextListener或RequestContextFilter公开当前   请求“。

任何想法如何在线程

中使用会话变量

2 个答案:

答案 0 :(得分:0)

尝试在web.xml中添加以下内容

<web-app ...>
   <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
   </listener>
</web-app>

它不起作用,你可以制作一个简单的DTO(POJO)并将其传递给线程。

答案 1 :(得分:0)

通常,您只能从Web请求处理线程的范围内访问会话,因为您需要请求上下文来了解要使用的会话。 Grails控制器中对session属性的引用实际上是对Grails注入到类中的getSession()方法的Groovy样式调用,该方法从当前请求中动态获取正确的会话。

可以在控制器操作的本地变量中存储对此会话的引用,然后在Thread.start闭包内引用该变量:

public updatename()
{
    println(session["firstname"]);
    def theSession = session
    Thread.start
    {
            theSession["firstname"] = "atul";
            println(theSession["firstname"]);         
    }
}

但我自己没试过。