如何在 groovy 线程中使用会话

Posted

技术标签:

【中文标题】如何在 groovy 线程中使用会话【英文标题】:how to use session inside groovy thread 【发布时间】:2013-09-17 03:55:33 【问题描述】:

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

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

我可以在线程外访问会话变量,但在线程内的会话中出现以下错误

“错误 java.lang.IllegalStateException:未找到线程绑定请求: 您是否指的是实际网络之外的请求属性 请求,或处理原始接收之外的请求 线?如果您实际上是在 Web 请求中操作并且仍然 收到此消息,您的代码可能在 DispatcherServlet/DispatcherPortlet:在这种情况下,使用 RequestContextListener 或 RequestContextFilter 暴露当前 请求。”

知道如何在线程中使用会话变量

【问题讨论】:

我猜您正在控制器中尝试此操作,根据非常清晰的错误消息,我认为这不会起作用。相反,您可以将该逻辑移至服务并尝试。我宁愿建议您使用Executor plugin 来实现您尝试使用 Thread 实现的目标。 谢谢 dmahapatro。我会查看您提供的链接 @dmahapatro,我使用了执行器插件,在单独的线程中使用标记库时发现了同样的问题,我通过制作简单的 DTO 并将其传递给异步块来解决它。 【参考方案1】:

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

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

public updatename()

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

但我自己没有尝试过。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何在 groovy 线程中使用会话的主要内容,如果未能解决你的问题,请参考以下文章

单击注销时如何从所有活动会话中注销?

在 grails 中,我如何获得对所有当前会话的引用?

如何在无状态会话 bean 中创建多线程?

在 log4j appenders 内的 config.groovy 中访问会话用户

从另一个线程访问用户会话对象,如何实现?

蚂蚁如何在groovy中使用