Grails 如何在groovy线程中使用会话
我是Groovy的新手。我想在Groovy线程中更新会话变量。 我不能把真正的代码,所以我把样本代码Grails 如何在groovy线程中使用会话,grails,groovy,Grails,Groovy,我是Groovy的新手。我想在Groovy线程中更新会话变量。 我不能把真正的代码,所以我把样本代码 public updatename() { println(session["firstname"]); Thread.start { session["firstname"] = "atul"; println(session["firstname"]);
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并将其传递给异步块解决了这个问题。