在会话bean中存储进度信息

时间:2015-08-06 06:57:35

标签: java multithreading spring spring-mvc

我们使用基于DNS的负载均衡器在2个地理位置运行4个tomcat服务器实例。我们提供一些出口服务,这些任务需要大量时间才能完成。因此,用户通常会向我们的某个服务器提交请求,并负责整个处理。

enter image description here

当用户稍后请求随机选择的实例的进度信息时,会出现问题。

我正考虑在所有实例中共享进度信息,例如使用Redis共享Spring身份验证。我尝试使用带有aop代理的spring会话bean来共享进度信息,但这似乎是一个坏主意。我做了一些研究和调试,显示bean存储在Redis中,可以被所有实例访问,但状态不再更新。我相信这是因为在原始请求返回给调用者之后,线程无法更新会话信息。

我能想到的另一个解决方案是使用我们的MySQL数据库来存储这些信息,但我担心因不断更新进度信息而导致的巨大过载。

有什么想法可以解决我的问题吗?

提前致谢,

米甲

1 个答案:

答案 0 :(得分:0)

好的,我终于解决了我的问题。我一直在努力想要在会话中保持进度信息,这在处理异步任务时是不可用的,而且我完全忽略了这不是一个好主意的事实: - )

我的新解决方案尽可能简单。当用户请求任务处理并返回给客户端时,将生成唯一的任务ID。在定义的任务键下,在redis中不断更新进度信息,以便稍后在客户端请求任务状态时可以使用任务ID。不需要使用会话,因为redis实例是通过复制本身同步的。

redis-cli preview

感谢大家的评论!

问候,

米甲