服务内部的弹簧@Async方法
2022-09-02 00:23:34
我有这个服务bean,它有一个调用内部异步方法的sync方法:
@Service
public class MyService {
public worker() {
asyncJob();
}
@Async
void asyncJob() {
...
}
}
麻烦的是,实际上并没有以异步方式调用 。我发现这不起作用,因为内部调用跳过了AOP代理。asyncJob
所以我试着自我推荐豆子:
@Service
public class MyService {
MyService mySelf;
@Autowired
ApplicationContext cnt;
@PostConstruct
public void init() {
mySelf=(MyService)cnt.getBean("myService");
}
public void worker() {
mySelf.asyncJob();
}
@Async
void asyncJob() {
...
}
}
它失败了。同样没有异步调用。
所以我试着把它分成两个豆子:
@Service
public class MyService {
@Autowired
MyAsyncService myAsyncService;
public void worker() {
myAsyncService.asyncJob();
}
}
@Service
public class MyAsyncService {
@Async
void asyncJob() {
...
}
}
再次失败。
唯一的工作方式是从控制器 Bean 调用它:
@Controller
public class MyController {
@Autowired
MyAsyncService myAsyncService;
@RequestMapping("/test")
public void worker() {
myAsyncService.asyncJob();
}
}
@Service
public class MyAsyncService {
@Async
public void asyncJob() {
...
}
}
但在这种情况下,这是一项服务工作。为什么我无法从服务调用它?