Grails 如何在groovy线程中使用会话

Grails 如何在groovy线程中使用会话,grails,groovy,Grails,Groovy,我是Groovy的新手。我想在Groovy线程中更新会话变量。 我不能把真正的代码,所以我把样本代码 public updatename() { println(session["firstname"]); Thread.start { session["firstname"] = "atul"; println(session["firstname"]);

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

public updatename()
    {
        println(session["firstname"]);
        Thread.start
        {
                session["firstname"] = "atul";
                println(session["firstname"]);         
        }
    }
我能够访问线程外的会话变量,但线程内的会话出现以下错误

“错误java.lang.IllegalStateException:未找到线程绑定请求: 您指的是实际web之外的请求属性吗 请求,或在原始接收范围之外处理请求 线程?如果您实际上是在web请求中操作,并且 收到此消息时,您的代码可能正在外部运行 DispatcherServlet/DispatcherPortlet:在这种情况下,使用 RequestContextListener或RequestContextFilter公开当前 请求。”


知道如何在线程内部使用会话变量吗?请尝试在web.xml中添加以下内容

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

org.springframework.web.context.request.RequestContextListener

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

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

可以在控制器操作中的局部变量中存储对此会话的引用,然后在
线程中引用该变量。开始
关闭:

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

但我自己还没有试过。

我猜您是在控制器中试过,我认为根据非常清晰的错误消息,该控制器不起作用。相反,您可以将该逻辑转移到服务并尝试。我宁愿建议您使用来实现您试图通过线程实现的目标。谢谢您,dmahapatro。我会调查你的链接provided@dmahapatro,我使用了executor插件,在单独的线程中使用标记库时发现了相同的问题,我通过制作简单的DTO并将其传递给异步块解决了这个问题。