栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

java使用Future实现多线程执行和结果聚合

java使用Future实现多线程执行和结果聚合

文章目录
    • 场景
    • 解决

场景
  • 网站智能问答场景,需要对多个分类查询,结果聚合展示
  • 由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elasticsearch搜索引擎,有的需要调用第三方接口,数据查询要分开进行,没法一次查询搞定
  • 实际上这几个查询不相关,可以同时进行,现在串行,使该场景下,智能问答返回较慢
解决
  • 最简单的逻辑,肯定就是java多线程,将串行改为并行
  • 这样查询返回时间,就取决于最慢的一个查询,返回时间大大缩短
  • 页面返回一般要求三秒内,实际项目上我们要求1秒内返回,多线程解决了这个问题
  • 下面上代码,部分截取
	@Autowired
    private ThreadPoolTaskExecutor taskExecutor;
// 新闻查询
            SolrPageQueryVO newsQueryVO = new SolrPageQueryVO();
            BeanUtil.copyProperties(vo, newsQueryVO);
            newsQueryVO.setAllSite(vo.getAllSite());
            newsQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.articleNews.toString().concat(",")
                    .concat(SolrPageQueryVO.TypeCode.pictureNews.toString())
                    .concat(",").concat(SolrPageQueryVO.TypeCode.videoNews.toString()));
            Future newsFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, newsQueryVO, "news", context));

            //网上服务
            Future workGuideFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, vo, "workGuide", context));

            //留言
            SolrPageQueryVO messageBoardQueryVO = new SolrPageQueryVO();
            BeanUtil.copyProperties(vo, messageBoardQueryVO);
            messageBoardQueryVO.setAllSite(vo.getAllSite());
            messageBoardQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.messageBoard.toString());
            Future messageBoardFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, messageBoardQueryVO, "messageBoard", context));

            //信息公开(isAllSite为true时,搜索所有集合,不区分集合和站点,只根据dn搜索,有区分需要的项目可以重写SearchEsServiceImpl类)
            SolrPageQueryVO publicContentQueryVO = new SolrPageQueryVO();
            BeanUtil.copyProperties(vo, publicContentQueryVO);
            publicContentQueryVO.setAllSite(vo.getAllSite());
            publicContentQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.public_content.toString());
            Future publicContentFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, publicContentQueryVO, "public_content", context));


            //问答知识库(isAllSite为true时,搜索所有集合,不区分集合和站点,有区分需要的项目可以重写或传false)
            SolrPageQueryVO knowledgebaseQueryVO = new SolrPageQueryVO();
            BeanUtil.copyProperties(vo, knowledgebaseQueryVO);
            knowledgebaseQueryVO.setAllSite(vo.getAllSite());
            knowledgebaseQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.knowledgebase.toString());
            Future knowledgebaseFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, knowledgebaseQueryVO, "knowledgebase", context));

            try {
                knowledgebaseFuture.get();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                messageBoardFuture.get();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                newsFuture.get();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                publicContentFuture.get();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                workGuideFuture.get();
            } catch (Exception e) {
                e.printStackTrace();
            }

            tabcount = sumMap.values().size();
            map.put("tabcount", tabcount);
            map.put("numMap", sumMap);
 private void selectForAsk(Map map, Map sumMap, SolrPageQueryVO vo, String type, Context context) {
        if ("news".equals(type)) {
            try {
                // do something
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if ("workGuide".equals(type)) {
            try {
                //网上办事查询调用接口
               // do something
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if ("messageBoard".equals(type)) {
            try {
                // do something
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if ("public_content".equals(type)) {
            try {
                Long queryCount = SearchQueryHolder.queryCount(vo);
                // do something
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if ("knowledgebase".equals(type)) {
            try {
                // do something
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号