Grails从线程访问请求/会话时没有找到线程绑定请求

时间:2017-11-03 16:39:19

标签: multithreading session grails

我正在使用Grails 2.5.6。

我有一系列先前已连续执行的任务,需要引用我在会话中使用的“lang”属性。

现在从控制器我调用一个创建线程的类,每个任务一个加速执行。添加线程后,当代码尝试访问会话时,此错误开始出现:

// update projection
var currTranslate = projection.translate();
  projection.translate([currTranslate[0] + d3.event.dx, currTranslate[1] + d3.event.dy]);

// update paths
g.selectAll("path").attr("d", path);

我相信在我创建的线程中需要设置一些东西才能访问请求/会话,但找不到任何文档。

访问会话的方式是:

// update projection
var currTranslate = projection.translate();
projection.translate([currTranslate[0] + d3.event.dx, currTranslate[1] + d3.event.dy]);

// update paths coordinates
g.selectAll("path").attr("d", path);

// update circle coordinates                
svg.selectAll(".city-circle")
  .attr("cx",function(d){
              var coords = projection([d.Attribute_Longitude,d.Attribute_Latitude]);
    return coords[0];
  })
  .attr("cy",function(d){
    var coords = projection([d.Attribute_Longitude,d.Attribute_Latitude]);
    return coords[1];
  })

在添加主题之前,这个工作正常。

我需要做些什么来处理新线程的代码行?

BTW我尝试了两种创建线程的方法,经典的Thread.start / treads * .join()和使用grails.async.Promises(http://docs.grails.org/2.5.6/guide/async.html)。在两者上我得到相同的错误消息。

1 个答案:

答案 0 :(得分:0)

params 对象从控制器传递给线程run()方法时,我也遇到了同样的问题, 当我们将它们传递给线程时,像params,request和response这样的对象没有更长的引用,所以我们需要将它保存在另一个变量中,我的操作如下,

def  paramsData = params // you can declare other objects like request and eesponse 

现在您可以将变量 paramsData 传递给您的线程。

您可以尝试在web.xml中添加requestContext侦听器并按如下方式重置应用程序

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