如何在 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 线程中使用会话的主要内容,如果未能解决你的问题,请参考以下文章