Java Spring@Async带注释的方法在调用自身时会阻塞
在我的软件中,我使用Java Spring@Async带注释的方法在调用自身时会阻塞,java,spring,asynchronous,Java,Spring,Asynchronous,在我的软件中,我使用@Async在Tomcat启动时,从后台的Bean调用某个方法,这是可以预期的 但是,在某些已定义的情况下,该方法所做的是失败的,并且该方法myUtil.connect()调用自身,然后重试 基本代码如下所示 bean定义: import org.springframework.context.annotation.Bean; import package.MyService; @Bean(initMethod = "init", destroyMethod = "dest
@Async
在Tomcat
启动时,从后台的Bean
调用某个方法,这是可以预期的
但是,在某些已定义的情况下,该方法所做的是失败的,并且该方法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();
}
}
我也尝试过用@Async
注释方法connect()
,因为它调用自己,@Async
也会使它在后台运行,但没有成功
是否有办法确保后续调用connect()
“保留”在后台
编辑:
将
connect()
包装成一个真正起作用的函数是否有效?通过这种方式,connect()
只需调用一次,如果出现故障,包装的函数将自动调用。我的需求的工作解决方案如下所示:
首先,我必须将@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() {}
}
位于的文档提供了必要的提示:
要异步初始化Springbean,请执行以下操作:
必须使用单独的初始化Springbean来调用
@然后在目标上使用异步带注释的方法
哪个方法调用自己?调用的位置和内容
init()
?请参阅我更新的问题@ASync
可能正在使用代理,并且内部调用未被代理。connect()
是否调用自身?你预计会发生什么?到底发生了什么?