在我的软件中,我使用@Async
在Bean
启动时从后台的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()
只会被调用一次,包装函数会在失败的情况下自行调用。
答案 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() {}
}
要异步初始化您当前的Spring bean 必须使用一个单独的初始化Spring bean来调用 然后在目标上使用@Async注释方法。