spring基于@Async实现方法异步解耦

1.在启动类上加入@EnableAsyn注解

@CrossOrigin
@EnableTransactionManagement
@SpringBootApplication
@EnableSwagger2Doc
@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled = true)
@EnableCaching
@EnableAsync
public class PartStockApplication {
    public static void main (String[] args)
    {
        SpringApplication.run(PartStockApplication.class,args);
    }

}

2实现方法的异步解耦

需要注意的是,因为@Async注解的实现是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。就会出现有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。所以会出现没有实现异步的情况

      1.先创建一个component类(直接用this会出现不是异步的情况,通过获取类的代理类来解决不是调用spring容器中的该类中的方法)

@Component
public class TestTask {
    @Autowired
    private PartsService partsService;
    @Autowired
    private PositionService positionService;
    @Autowired
    private SpringUtils springContextUtil;

    @Async
    public Future<List<PartVo>> doTaskOneCallback() throws Exception {
        TestTask testTask =springContextUtil.getBean(TestTask.class);
        List<PartVo> partList = testTask.getPartList();
        return new AsyncResult<List<PartVo>>(partList);
    }

    @Async
    public Future<List<CategoryVo>> doTaskTwoCallback() throws Exception {
        TestTask testTask = springContextUtil.getBean(TestTask.class);
        List<CategoryVo> categoryList = testTask.getCategoryList();
        return new AsyncResult<List<CategoryVo>>(categoryList);
    }


    public  List<PartVo> getPartList() throws InterruptedException {
        System.out.println("开始查询零件");
        long start=System.currentTimeMillis();
        List<PartVo> partsList=partsService.selectAll();
        sleep(6000);
        long end=System.currentTimeMillis();
        System.out.println("零件查询完成耗时"+(end-start)+"毫秒");
        return partsList;
    }
    public List<CategoryVo> getCategoryList() throws InterruptedException {
        System.out.println("获取特殊的四级类目开始");
        long start=System.currentTimeMillis();
        int status=1;
        int type=2;
        List<CategoryVo> list=positionService.selectAll(status,type);
        List<CategoryVo> lists=new ArrayList<>();
        List<CategoryVo> treeOne=list.stream().filter(item->{
            return item.getParentId()==0;
        }).collect(Collectors.toList());
        List<CategoryVo> treeNotOne=list.stream().filter(item->{
            return item.getParentId()!=0;
        }).collect(Collectors.toList());
        treeOne.forEach(item->{
            treeSet(item,treeNotOne);
        });
        treeSets(lists,treeOne);
        sleep(5000);
        long end=System.currentTimeMillis();
        System.out.println("获取特殊的四级类目耗时"+(end-start)+"毫秒");
        return lists;
    }
    public void  treeSet(CategoryVo categoryVo,List<CategoryVo> categoryVoList){
        List<CategoryVo> list=new ArrayList<>();
        categoryVoList.forEach(item->{
            if(categoryVo.getId().equals(item.getParentId())){
                item.setName(categoryVo.getName()+"/"+item.getName());
                list.add(item);
                treeSet(item,categoryVoList);
            }
        });
        if(!list.isEmpty()){
            categoryVo.setChildren(list);
        }
    }

    public void  treeSets(List<CategoryVo> categoryVoList,List<CategoryVo> treeOne){
        treeOne.forEach(item->{
            if(item.getChildren()!=null){
                treeSets(categoryVoList,item.getChildren());
            }else{
                categoryVoList.add(item);
            }
        });
    }

}

测试类(1个是同步代码块一个是实现了异步)

@RestController
@RequestMapping("test")
@CrossOrigin
public class TestController {
    @Autowired
    private TestTask testTask;

    @PostMapping(value = {"testAsync"})
    public List<PartVo>  main() throws Exception {
        long start=System.currentTimeMillis();

        Future<List<PartVo>> stringFuture = testTask.doTaskOneCallback();
        Future<List<CategoryVo>> stringFuture1 = testTask.doTaskTwoCallback();
        List<PartVo> partsList = stringFuture.get();


        List<CategoryVo> categoryList = stringFuture1.get();

        while (!stringFuture.isDone() || !stringFuture1.isDone() ) {
            sleep(100);
        }
//        List<CategoryVo> categoryList = this.getCategoryList();
//        List<PartVo> partsList = this.getPartList();

        Map<String, List<CategoryVo>> collect = categoryList.stream().collect(Collectors.groupingBy(CategoryVo::getName, Collectors.toList()));
//        Map<String, CategoryVo> collect = lists.stream().collect(Collectors.toMap(CategoryVo::getName, CategoryVo->CategoryVo));
        for(PartVo part:partsList) {
            if (collect.get(part.getPCategoryId()) != null) {
                part.setPCId(collect.get(part.getPCategoryId()).get(0).getId());
            }
        }
//        partsService.updatePCId(partsList);
        long end=System.currentTimeMillis();
        System.out.println("任务全部完成,总耗时:" + (end - start) + "毫秒");
        return partsList;
    }




    @PostMapping("partVerse")
    @Transactional
    public List<PartVo> test() throws InterruptedException {
        long start2=System.currentTimeMillis();
        List<PartVo> partsList=testTask.getPartList();
        List<CategoryVo> lists = testTask.getCategoryList();

        Map<String, List<CategoryVo>> collect = lists.stream().collect(Collectors.groupingBy(CategoryVo::getName, Collectors.toList()));
//        Map<String, CategoryVo> collect = lists.stream().collect(Collectors.toMap(CategoryVo::getName, CategoryVo->CategoryVo));
        for(PartVo part:partsList) {
            if (collect.get(part.getPCategoryId()) != null) {
                part.setPCId(collect.get(part.getPCategoryId()).get(0).getId());
            }
        }
//        partsService.updatePCId(partsList);
        long end2=System.currentTimeMillis();
        System.out.println("任务全部完成,总耗时:" + (end2 - start2) + "毫秒");
        return partsList;

    }
}

结果 同步代码块

实现异步以后的结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值