Controller
@RestController
@RequestMapping(value = "v1/app")
@Slf4j
public class AppController {
@Autowired
private LogService logService;
/**
* 全部查询
*
* @param mmpDesignerApp 查询对象
* @return 统一返回对象
*/
@RequestMapping(value = "listall2", method = RequestMethod.GET)
public BaseResponseVo listAll2(
@RequestParam(required = false) Map<String, String> mmpDesignerApp,
HttpServletRequest req
) throws Exception {
log.info("controller线程Id:"+Thread.currentThread().getId()+",开始");
logService.saveBizLog("","","","","",1,"");
log.info("controller线程Id:"+Thread.currentThread().getId()+",结束");
return BaseResponseVo.ok("测试aaaaaaaaa");
}
}
Service
@Service
@Slf4j
public class LogServiceImpl implements LogService {
@Autowired
private LogFeignService logService;
/**
* 记录日志
*
* @param details 详细内容
* @param ip IP地址
* @param operation 操作内容
* @param url 路径
* @param token token
* @return return
* @throws Exception 异常
*/
@Override
@Async
public void saveBizLog(String details, String ip, String operation,
String url,
String token, int code, String mac) throws Exception {
log.info("日志线程Id:"+Thread.currentThread().getId());
HashMap<String, Object> obj = new HashMap<>(12);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
obj.put("datetime", df.format(new Date()));
obj.put("description", details);
obj.put("clientIp", ip);
obj.put("clientMac", mac);
obj.put("microName", "移动中台");
obj.put("optKind", operation);
obj.put("querystring", "");
obj.put("requestUrl", url);
obj.put("userId", "UserUtils.getUserIdByToken(token)");
obj.put("userName", "UserUtils.getUserNameByToken(token)");
obj.put("staffName", "UserUtils.getStaffNameByToken(token)");
obj.put("code", code);
logService.saveBizLog(MapperUtils.obj2json(obj));
}
}
执行结果:
可以看到确实在不同的线程里
但是用postman请求的时候,返回结果都要等待异步任务执行完才返回,请问这是怎么回事?
@EnableAsync ?
有的
以日志结果为准,图中日志显示确实为异步,没有问题。
确实是异步,但是我用postman请求接口,非得等到异步线程处理完,才能获取到结果是怎么回事?
@镇魂帆2: postman请求的时候也有日志,你看下日志里的执行顺序
@luzemin: 和客户端没关系吧,我另外一个接口,可以立即接收到
@镇魂帆2: 肯定与客户端没关系,都是发HTTP请求而已
@luzemin: 我加了Thead.sleep()后,睡眠时间端也是一样,睡眠时间长就正常了
C#的1 异步是 把任务交给了非主线程来执行(并不都是) 执行完再由主线程返回结果(也可由执行任务的线程直接返回结果) 所以必须要等待执行完才返回,这里的异步机制是否也是这样?
跟这个没关系,还是IDE的问题
我可能知道问题在哪了,其实不是代码的问题,是idea调试的时候,断点挂起所有线程引起的,这里可以把断点挂起改成线程,而不是所有
我可能知道问题在哪了,其实不是代码的问题,是idea调试的时候,断点挂起所有线程引起的,这里可以把断点挂起改成线程,而不是所有
– 镇魂帆2 2年前