@Async Spring会针对不同会话的每个请求进行调用

时间:2013-05-21 10:08:50

标签: java spring spring-mvc asynchronous

我在bean中有一个Spring @Async注释方法,然后在控制器中我在用户请求上调用该bean的方法,我这样做,所以我可以从该bean获得进度,并且它工作正常为此。

但是当我从另一个会话中打开它时,控制器似乎重新启动该方法,并且进度再次返回到起点。

如何正确执行此操作,我将进度计数作为bean中的字段。然后我在@Async方法中递增它,然后通过AJAX请求返回到从bean中检索它的控制器。

但它和控制器一样只注入了一个bean。或者整个应用程序只有一个控制器,这里有什么问题?

修改

我测试了打开两个不同的浏览器并运行任务,但它们都重新加载。

1 个答案:

答案 0 :(得分:0)

显然 Spring控制器是每个网络应用程序的单例(当你考虑它们时应该是这样),所以如果你有一个连接到它的组件,它们就不是线程安全的。

如果两个用户向使用bean AC 方法发送请求,则假设您已将bean A 连接到控制器 AC 一个同时,你们两个都有错误的值,或者你们每次调用都会重建bean,所以如果 user1 启动任务,那么在任务完成之前一段时间后已完成 user2 即可启动,然后 user1 '值会重置等等。

为避免这种情况,我发现您应该使用注释或xml将使用Session Scoped注释的控制器连接到bean。

在我的情况下,我使用

@Scope("session")

你永远不应该对控制器进行注释,因为它不会起作用,如果这样做会产生奇怪的行为。

您还应该(如果使用像我这样的注释)在scoped-proxy="targetClass"元素中添加<context:component-scan />