我在bean中有一个Spring @Async注释方法,然后在控制器中我在用户请求上调用该bean的方法,我这样做,所以我可以从该bean获得进度,并且它工作正常为此。
但是当我从另一个会话中打开它时,控制器似乎重新启动该方法,并且进度再次返回到起点。
如何正确执行此操作,我将进度计数作为bean中的字段。然后我在@Async方法中递增它,然后通过AJAX请求返回到从bean中检索它的控制器。
但它和控制器一样只注入了一个bean。或者整个应用程序只有一个控制器,这里有什么问题?
修改
我测试了打开两个不同的浏览器并运行任务,但它们都重新加载。
答案 0 :(得分:0)
显然 Spring控制器是每个网络应用程序的单例(当你考虑它们时应该是这样),所以如果你有一个连接到它的组件,它们就不是线程安全的。
如果两个用户向使用bean 的 AC 方法发送请求,则假设您已将bean A 连接到控制器 AC 一个同时,你们两个都有错误的值,或者你们每次调用都会重建bean,所以如果 user1 启动任务,那么在任务完成之前一段时间后已完成 user2 即可启动,然后 user1 '值会重置等等。
为避免这种情况,我发现您应该使用注释或xml将使用Session Scoped
注释的控制器连接到bean。
在我的情况下,我使用
@Scope("session")
你永远不应该对控制器进行注释,因为它不会起作用,如果这样做会产生奇怪的行为。
您还应该(如果使用像我这样的注释)在scoped-proxy="targetClass"
元素中添加<context:component-scan />