Spring @Async注释方法在调用自身时会阻塞

时间:2014-03-17 21:03:44

标签: java spring asynchronous

在我的软件中,我使用@AsyncBean启动时从后台的Tomcat调用某个方法,这可以按预期工作。

但是,在某些定义的情况下,该方法的作用是失败,方法myUtil.connect()会调用自己然后重试。

基本代码如下所示。

bean定义:

import org.springframework.context.annotation.Bean;
import package.MyService;

@Bean(initMethod = "init", destroyMethod = "destroy")
MyService myService() {
    MyService bean = new MyService();
    return bean;
}

MyService bean:

import javax.inject.Inject;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class MyService {

    @Inject
    private MyUtil         myUtil;

    @Async
    public void init() {
        myUtil.connect();
    }
}

我已经尝试用connect()注释方法@Async,因为它自称,@Async会使它在后台运行,但没有成功。

有没有办法确保后续拨打connect()“仍然”在后台?

修改

是否正在努力使connect()成为实现真正工作的函数的包装器?这种方式connect()只会被调用一次,包装函数会在失败的情况下自行调用。

1 个答案:

答案 0 :(得分:2)

我的要求的工作解决方案如下:

首先,我必须将@EnableAsync添加到我的根上下文配置类(这是创建MyService bean的配置类)。

然后我将@Async注释从MyService移到了MyUtils类。

MyService类:

import javax.inject.Inject;
import org.springframework.stereotype.Component;

@Component
public class MyService {

    @Inject
    private MyUtil         myUtil;


    public void init() {
        myUtil.connect();
    }
}

MyUtil类:

@Component
public class MyUtil {

    @Async
    public void connect() {}

}

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-async处的文档提供了必要的提示:

  

要异步初始化您当前的Spring bean   必须使用一个单独的初始化Spring bean来调用   然后在目标上使用@Async注释方法。