场景:在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失效相关推荐

  1. Spring Boot 中使用@Async实现异步调用,加速任务执行!

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...

  2. Spring Boot中使用@Async实现异步调用

    什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...

  3. springboot(三):Spring boot中Redis的使用

    转自www.ityouknow.com spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memc ...

  4. 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)

    上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...

  5. (转)Spring Boot(三):Spring Boot 中 Redis 的使用

    http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html Spring Boot 对常用的数据库支持外,对 Nosql ...

  6. springboot怎么返回404_Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...

  7. 第 4-4 课:Spring Boot 中使⽤ Cache 缓存的使⽤

    我们知道绝⼤多数的⽹站/系统,最先遇到的⼀个性能瓶颈就是数据库,使⽤缓存做数据库的前置缓存,可以 ⾮常有效地降低数据库的压⼒,从⽽提升整个系统的响应效率和并发量. 以往使⽤缓存时,通常创建好缓存⼯具类 ...

  8. Spring Boot 中三种跨域场景总结

    文章目录 1.什么是跨域 2.解决方案 2.1 存在的问题 3.SpringSecurity 3.1 方式一 3.2 方式二 4.OAuth2 5.小结 跨域这个问题松哥之前写过文章,但是最近收到小伙 ...

  9. 在Spring Boot中使用Log4j2

    实在看不下去搜索引擎查出来的文章中各种错误的配置信息,于是翻译了下文. 翻译原文:How to use Log4j2 with Spring Boot Apache Lo4j 2 是Log4j 1.x ...

最新文章

  1. 微服务架构:注册中心 ZooKeeper、Eureka、Consul 、Nacos 对比!
  2. 消息积压在消息队列里怎么办
  3. VS调试python中的DLL
  4. java 凑整_Java语言中的取整运算(包括截尾取整,四舍五入,凑整)? – 日记
  5. 【java】java AsyncHttpClient使用
  6. leetcode41. First Missing Positive
  7. Linux下修改TomcatJVM内存大小
  8. java集合升序降序
  9. java转盘抽奖代码_Java 实现大转盘抽奖
  10. stm8L 触摸库使用教程 一步一步
  11. iphone4s蜂窝数据连不上解决方案
  12. 实现app第一次安装浮层引导View!
  13. 一种简单的仓储系统实物可视化分布实现方案
  14. 手把手教你拥有自己的代码生成器-------->坑居多
  15. mysql使用注意事项
  16. 计算机网络考研面试题
  17. 读《移山之道》——问渠哪得清如许,为有源头活水来
  18. Hexo yilia 主题一揽子使用方案
  19. 计算机英语简写对照,计算机术语简写-全称对照表.pdf
  20. 哪些APP开发公司比较好

热门文章

  1. ASP.NET之SOAP的发送、接收与处理类 [转载]
  2. 里bl2和bl3为什么分开_分手挽回:为什么不建议过早同居
  3. js中当等于最小值是让代码不执行_JavaScript中最最基础的知识点
  4. 鸿蒙os终于开始大升级,华为鸿蒙OS终于要迎来大规模推送升级了
  5. 用计算机器提高正确率,计算机作业,正确率要90%
  6. 读写分离怎么实现_项目中如何实现读写分离?怎么配置?
  7. lua检测表中是否有某个值,如何检查表是否包含Lua中的元素?
  8. 电脑壁纸知乎_电脑壁纸(个人向
  9. php隐藏表单提交表单提交表单_表单提交及php处理表单数据的实例
  10. 九十五、二叉树的递归和非递归的遍历算法模板