java - session 范围内的 Spring bean 的外部线程回调

标签 java multithreading spring session callback

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

当此回调方法需要在 Spring 的 session 范围内操作某些 bean 时,就会出现问题。因为当回调实现想要访问 Spring bean 时,回调在驱动程序的线程中被调用,它会产生一个异常,指出当前线程不在 Spring 的托管范围内。

我想知道是否有任何方法可以使实现回调接口(interface)的对象成为某种代理,该代理知道有关构造它的 session 上下文的信息,这样它就可以通过 Spring 的上下文对象调用 bean 方法?

最佳答案

我认为您是从错误的角度来解决问题的。我想您希望设备驱动程序回调将一些结果放入用户 session 中。但这还不足以显示该数据,因此(再次猜测)可能涉及一些长轮询,通过 session 范围的 bean 查看 session 。

根据这个假设,我建议您在每次调用后端驱动程序时生成某种唯一的 requestId,并将该 requestId 放入 HTTP session 和回调。当调用回调时,它将结果推送到某种映射中,其中键是分配的 requestId。现在客户端(也知道 requestId)可以查看 map 并获取结果。您必须记住同步(普通 HttpSession 也是如此)。

如果您有一些更高级的方式来通知客户端(Comet?WebSockets?),也可以在此回调中完成。

请注意,从技术上讲,您可以将 HttpSession 对象的实例传递给回调实例(但如您所见,这不适用于 Spring session 范围的 bean),但传递 session 似乎并不适用喜欢一个好的设计。最好提供一定程度的间接性。如果将来您想通过命令行或桌面客户端重用该代码怎么办?

关于java - session 范围内的 Spring bean 的外部线程回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9212663/

相关文章:

java - 微服务架构、认证等服务

Java,Telnet,检查输入流中的字符串

java - 多线程比单线程快吗?

java - 登录失败后,Spring Security 会阻止用户

java - 如何使用 javax.mail 库将 byte[] 转换为消息

java - 使用泛型和 rxjava 的不兼容类型

c++ - 根据intel博客实现concurrent_vector

c# - 进程线程名称

java - 分析不同分支的 Maven 依赖关系

java - 使用 AOP 作用域代理在单例 bean 中 Autowiring 原型(prototype) bean