spring boot中使用@Async失效
场景:在service中用户新增的方法中调用接口上传数据到其他库的接口,在新增方法上使用了@Transactional,在上传数据方法上使用了@Async,然后发现@Async注解不生效。
解决方案:不要直接在service用户新增中调用上传接口,改为在controller中即可。
代码如下:
service层
@Transactional public User userEdit(String name,String mobile,String pwd,String ip,String type,Integer companyId,Integer roleId){User user = new User();user.setLoginKey(mobile);user.setLoginPwd(pwd);if(StringUtils.isNotBlank(name)){user.setName(name);}else {user.setName(mobile);}user.setUserState(Enums.UserState.Normal);user.setUnlockTime(null);user.setErrorLoginCount(0);user.setLastLoginIp(ip);user.setLastLoginTime(new Date());if ("Driver".equalsIgnoreCase(type)){user.setType(Enums.UserType.Driver);dao.save(user);Driver driver = new Driver();driver.setUserId(user.getId());driver.setCompanyId(companyId);driverDao.save(driver);}else if ("Passenger".equalsIgnoreCase(type)){user.setType(Enums.UserType.Passenger);dao.save(user);Passenger passenger = new Passenger();passenger.setUserId(user.getId());passenger.setPhone(mobile);passengerDao.save(passenger);}else if ("Admin".equalsIgnoreCase(type)){user.setType(Enums.UserType.Admin);user.setRoles(roleId);dao.save(user);}return user; }/*** 上报信息*/ @Async public void mocpassengerUpload(String mobile){boolean update = true;MocPassengerInfo mocPassengerInfo = passengerInfoDao.getRepo().findByPhone(mobile);if (mocPassengerInfo == null){mocPassengerInfo = new MocPassengerInfo();update = false;}mocPassengerInfo.setPhone(mobile);mocPassengerInfo.setRegister(new Date());mocPassengerInfo.setStatus(mocService.upload("*",mocPassengerInfo, update ? MocInfo.Action.Update : MocInfo.Action.Add));passengerInfoDao.save(mocPassengerInfo);} |
controller层
@PostMapping("/api/user/register") public Result register(@Pattern(regexp = Const.REGEXP_MOBILE, message = "手机号[mobile]格式不正确") String mobile,@NotBlank(message = "密码[passwd]不能为空值") String passwd,@NotBlank(message = "用户类型[type]不能为空值") String type,String name,Integer companyId,Integer roleId,HttpServletRequest request){Map<String, Object> data = new HashMap<>();try {User users = userService.findUser(mobile,type);if (users!=null){return Result.fail(206, "用户已存在!");}if (CommonKit.passwdMD5(passwd).equalsIgnoreCase(CommonKit.passwd(mobile.substring(5)))) {return Result.fail(206, "密码过于简单,请更换密码");}if(companyId==null){companyId = Integer.valueOf(company);}User user = userService.userEdit(name,mobile, CommonKit.passwdMD5(passwd), IpKit.getIpAddr(request), type, companyId,roleId);data.put("uid", user.getId());data.put("token", tokenService.generate(user.getId(), 5*24*60));data.put("name", user.getName());data.put("mobile", user.getLoginKey());data.put("avatar", user.getPicUrl()!=null?rootUrl + user.getPicUrl():"");if(type.equals("Driver")){data.put("cname", companyInfoService.getDao().findSnapshoot(companyId).getName());}if(type.equals("Passenger")){userService.mocpassengerUpload(mobile);}}catch (Exception e){e.printStackTrace();return Result.error(901,"注册失败!");}return Result.ok(data); } |
使用@Async需要配置,配置如下:
package net.web.config;import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {//线程池设置ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize( 10 );//核心线程taskExecutor.setMaxPoolSize( 100 );//最大线程taskExecutor.setQueueCapacity( 40 );//队列大小taskExecutor.setThreadNamePrefix( "async-service-" );taskExecutor.initialize();return taskExecutor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {//直接返回 祖籍 AsyncUncaughtExceptionHandler 对象return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler();} } |
另外还需要在启动类上添加注解:@EnableAsync
spring boot中使用@Async失效相关推荐
- Spring Boot 中使用@Async实现异步调用,加速任务执行!
欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...
- Spring Boot中使用@Async实现异步调用
什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...
- springboot(三):Spring boot中Redis的使用
转自www.ityouknow.com spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memc ...
- 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)
上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...
- (转)Spring Boot(三):Spring Boot 中 Redis 的使用
http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html Spring Boot 对常用的数据库支持外,对 Nosql ...
- springboot怎么返回404_Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...
- 第 4-4 课:Spring Boot 中使⽤ Cache 缓存的使⽤
我们知道绝⼤多数的⽹站/系统,最先遇到的⼀个性能瓶颈就是数据库,使⽤缓存做数据库的前置缓存,可以 ⾮常有效地降低数据库的压⼒,从⽽提升整个系统的响应效率和并发量. 以往使⽤缓存时,通常创建好缓存⼯具类 ...
- Spring Boot 中三种跨域场景总结
文章目录 1.什么是跨域 2.解决方案 2.1 存在的问题 3.SpringSecurity 3.1 方式一 3.2 方式二 4.OAuth2 5.小结 跨域这个问题松哥之前写过文章,但是最近收到小伙 ...
- 在Spring Boot中使用Log4j2
实在看不下去搜索引擎查出来的文章中各种错误的配置信息,于是翻译了下文. 翻译原文:How to use Log4j2 with Spring Boot Apache Lo4j 2 是Log4j 1.x ...
最新文章
- 微服务架构:注册中心 ZooKeeper、Eureka、Consul 、Nacos 对比!
- 消息积压在消息队列里怎么办
- VS调试python中的DLL
- java 凑整_Java语言中的取整运算(包括截尾取整,四舍五入,凑整)? – 日记
- 【java】java AsyncHttpClient使用
- leetcode41. First Missing Positive
- Linux下修改TomcatJVM内存大小
- java集合升序降序
- java转盘抽奖代码_Java 实现大转盘抽奖
- stm8L 触摸库使用教程 一步一步
- iphone4s蜂窝数据连不上解决方案
- 实现app第一次安装浮层引导View!
- 一种简单的仓储系统实物可视化分布实现方案
- 手把手教你拥有自己的代码生成器-------->坑居多
- mysql使用注意事项
- 计算机网络考研面试题
- 读《移山之道》——问渠哪得清如许,为有源头活水来
- Hexo yilia 主题一揽子使用方案
- 计算机英语简写对照,计算机术语简写-全称对照表.pdf
- 哪些APP开发公司比较好
热门文章
- ASP.NET之SOAP的发送、接收与处理类 [转载]
- 里bl2和bl3为什么分开_分手挽回:为什么不建议过早同居
- js中当等于最小值是让代码不执行_JavaScript中最最基础的知识点
- 鸿蒙os终于开始大升级,华为鸿蒙OS终于要迎来大规模推送升级了
- 用计算机器提高正确率,计算机作业,正确率要90%
- 读写分离怎么实现_项目中如何实现读写分离?怎么配置?
- lua检测表中是否有某个值,如何检查表是否包含Lua中的元素?
- 电脑壁纸知乎_电脑壁纸(个人向
- php隐藏表单提交表单提交表单_表单提交及php处理表单数据的实例
- 九十五、二叉树的递归和非递归的遍历算法模板