0

我在 bean 中有一个带有 spring @Async 注释的方法,然后在控制器中我根据用户请求调用该 bean 的方法,我这样做是为了从该 bean 中获取进度,并且它可以正常工作。

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

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

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

编辑

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

4

1 回答 1

0

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

这意味着如果两个用户同时向使用 bean A的AC方法发送请求,假设您将 bean A连接到控制器AC,那么您将有两个错误的值,或者您将在每次调用时重建 bean,所以如果user1启动任务,在任务完成前一段时间user2开始发挥作用并且也想启动它,然后user1的值将重置,依此类推。

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

在我的情况下,我使用

@Scope("session")

你永远不应该注释控制器,因为它不会工作,如果它会产生奇怪的行为。

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

于 2013-05-22T14:30:14.940 回答