2012-02-09 64 views
2

我有一个和Spring Web MVC应用程序,我需要使用它以异步方式每次设备收集一些新的数据时,返回信息的外部设备驱动程序。我们需要在开始时将一个对象传递给开始读取方法。该对象实现了一个声明回调方法的API定义的接口。外螺纹回调会话作用域的Spring Bean

当这个回调方法需要在Spring的会话范围中操作某个bean时,问题就会引发。因为当回调实现想要访问Spring bean时,回调会在驱动程序的Thread中被调用,它会产生一个异常,说明当前线程不在Spring的受管作用域中。

我想知道是否有任何方法可以使实现回调接口的对象变成某种类型的代理,它知道构造它的会话上下文的信息,这样它就可以通过Spring的上下文调用bean方法目的?

回答

0

我认为你是从错误的方面接近问题。我想你想让设备驱动程序回调把一些结果放在用户会话中。但是这不足以显示数据,所以(再次猜测)可能涉及一些长轮询,通过会话范围的bean查看会话。

有了这个假设,我建议您每次调用后端驱动程序时都要生成某种唯一的requestId,并将requestId放在HTTP会话和回调中。当回调被调用时,它将结果推送到某种映射中,其中键为requestId。现在,客户(也知道requestId)可以查看地图并获取结果。您必须记住关于同步(正常HttpSession也是如此)。

如果有通知客户的一些更高级的方式(彗星?WebSockets的?)这也可以在这个回调完成。

请注意,从技术上讲,您可以将HttpSession对象的实例传递给回调实例(但您可以看到这不适用于Spring会话范围的bean),但传递会话似乎不是一个好设计。提供一个间接的级别更好。如果将来您希望将该代码重新用于命令行或桌面客户端,该怎么办?

+0

这是我想到的一个解决方案,但是我发现它有点“哈克”。 我们在浏览器中使用基于计时器的DWR。 DWR控制器对事件队列进行轮询,以知道要发送回浏览器的内容。回调实现应该有权将正确的事件放入队列(由Spring管理)。这是问题出现的地方。 – NagyI 2012-02-09 14:52:34