异步方法类:
@Component
public class LoginLogAsync {
@Async
public void addLoginLog(String url, String param) {
//异步代码
try {
URLUtils.sendPost(url, param);
} catch (Exception e) {
e.printStackTrace();
}
}
}
说明:
1,使用@Async需要注意,被注接的方法和使用的方法不能再同一个类中,需要放到不同的类中,然后在需要使用的类中注入异步方法的类
@Autowired
private final LoginLogAsync loginLogAsync;
2,程序需要开启异步,在主类上添加@EnableAsync或者在你配置的线程池上添加@EnableAsync
3,如果项目集成了shrio,可能会导致@Async失效。
解决方法:
1,这个失效是在service层失效,你可以直接在controller层注入异步方法的类
然后直接使用是可以的。
2,如果注释掉shiro 的话,那么service层里面是可以正常使用,我决定是shrio导致的异步方法类这个bean没有被springboot托管,也就是注入失败了
所以用另外的方式注入这个bean,
写一个获取bean 的工具类
@Component
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
然后通过这个类来创建异步方法类,即可正常使用。
var loginLogAsync = SpringContextUtils.getBean(LoginLogAsync.class);
//.....
loginLogAsync.addLoginLog(url, param);