【问题标题】:@Async Spring gets recalled for every request of different sessions@Async Spring 会因不同会话的每个请求而被召回
【发布时间】:2013-05-21 10:08:50
【问题描述】:

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

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

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

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

编辑

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

【问题讨论】:

  • 你能把你的@Async注解的方法和周围的类中的代码,以及对Async方法的调用的执行方式展示出来吗?
  • @BhashitParikh 非常感谢您的评论,但我找到了解决方案,我花了很多时间但我找到了。
  • 好吧,你可以在这里发布解决方案,并接受它作为答案。
  • 好吧,我完全忘记了,谢谢@BhashitParikh :)

标签: java spring spring-mvc asynchronous


【解决方案1】:

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

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

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

在我的情况下,我使用了

@Scope("session")

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2012-06-25
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多