首页 新闻 搜索 专区 学院

Controller里调用@Async方法,确实异步执行了,但是返回要等到异步执行完,这是怎么回事?

0
悬赏园豆:20 [待解决问题]

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请求的时候,返回结果都要等待异步任务执行完才返回,请问这是怎么回事?

镇魂帆2的主页 镇魂帆2 | 初学一级 | 园豆:6
提问于:2022-05-10 10:52

我可能知道问题在哪了,其实不是代码的问题,是idea调试的时候,断点挂起所有线程引起的,这里可以把断点挂起改成线程,而不是所有

镇魂帆2 1个月前
< >
分享
所有回答(4)
0

@EnableAsync ?

快乐的凡人721 | 园豆:2164 (老鸟四级) | 2022-05-10 11:01

有的

支持(0) 反对(0) 镇魂帆2 | 园豆:6 (初学一级) | 2022-05-10 11:10
0

以日志结果为准,图中日志显示确实为异步,没有问题。

luzemin | 园豆:514 (小虾三级) | 2022-05-10 15:51

确实是异步,但是我用postman请求接口,非得等到异步线程处理完,才能获取到结果是怎么回事?

支持(0) 反对(0) 镇魂帆2 | 园豆:6 (初学一级) | 2022-05-10 16:14

@镇魂帆2: postman请求的时候也有日志,你看下日志里的执行顺序

支持(0) 反对(0) luzemin | 园豆:514 (小虾三级) | 2022-05-10 16:59

@luzemin: 和客户端没关系吧,我另外一个接口,可以立即接收到

支持(0) 反对(0) 镇魂帆2 | 园豆:6 (初学一级) | 2022-05-10 17:27

@镇魂帆2: 肯定与客户端没关系,都是发HTTP请求而已

支持(0) 反对(0) luzemin | 园豆:514 (小虾三级) | 2022-05-10 17:28

@luzemin: 我加了Thead.sleep()后,睡眠时间端也是一样,睡眠时间长就正常了

支持(0) 反对(0) 镇魂帆2 | 园豆:6 (初学一级) | 2022-05-11 08:45
0

C#的1 异步是 把任务交给了非主线程来执行(并不都是) 执行完再由主线程返回结果(也可由执行任务的线程直接返回结果) 所以必须要等待执行完才返回,这里的异步机制是否也是这样?

码农白里黑 | 园豆:212 (菜鸟二级) | 2022-05-11 08:49

跟这个没关系,还是IDE的问题

支持(0) 反对(0) 镇魂帆2 | 园豆:6 (初学一级) | 2022-05-11 13:57
0

我可能知道问题在哪了,其实不是代码的问题,是idea调试的时候,断点挂起所有线程引起的,这里可以把断点挂起改成线程,而不是所有

镇魂帆2 | 园豆:6 (初学一级) | 2022-05-11 13:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册