【问题标题】:why my method is not Asyncronous?为什么我的方法不是异步的?
【发布时间】:2014-04-30 18:00:37
【问题描述】:

我正在尝试使用 Spring 3.0 提供的 @Async 注释使方法异步

我已经关注了

在我的module-context.xml 中包含以下内容

<task:executor id="initiateContactCreation" pool-size="2-10" queue-capacity="5"/>
<task:annotation-driven executor="initiateContactCreation" />

带有@Async的注解方法

@Async
    private void initiateContactCreation(String fromUserId, List<String> toUsers){
        logger.info("Inside Async method for contact creation");
        ContactDetails contactDetails = new ContactDetails();
        contactDetails.setUserId(fromUserId);
        contactDetails.setContactEmailIds(toUsers.toArray(new String[toUsers.size()]));
        this.contactsAndDirSvc.addContact(contactDetails);
        logger.info("Returning from Async method for contact creation");
    }

但我看到该方法不会立即返回控制权。

我的记录器显示 来自initiateContactCreation 的日志,然后来自addContact 的日志(PS。执行此方法需要时间,我不希望它同步执行),然后从我调用initiateContactCreation 的方法记录日志

我做错了什么?

【问题讨论】:

    标签: java spring asynchronous


    【解决方案1】:

    由于这个方法是私有的,我假设你是在这个类中使用“this”引用来调用这个方法的。 Spring 不能代理在类中进行的调用。调用必须来自您的类外部,以便 Spring 可以拦截并应用注释和其他代理内容。

    【讨论】:

    • 会公开我的方法吗?
    • 将其公开,然后使用this 调用它也无济于事。更好的方法是将此方法移动到不同的服务(如果可能,在接口后面),这将使 Spring 更容易代理。
    • 公开它不起作用,现在我需要尝试将它移动到不同的类并调用对吗?我也没有用这个来调用方法
    【解决方案2】:

    prabugp 的解释很到位,我没有什么要补充的了。

    我确实有一些链接,但是您应该检查 Spring AOP 的陷阱以及如何克服它们(也适用于您的代码)。

    1234

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2020-08-30
      • 1970-01-01
      • 2017-01-03
      • 2017-05-30
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多