java利用Future实现多线程执行与结果聚合实例代码 目录 场景 解决 总结 场景 网站智能问答场景,需要对多个分类查询,结果聚合展示 由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elasticsearch搜索引擎,有的需要调用第三
目录
- 场景
- 解决
- 总结
场景
网站智能问答场景,需要对多个分类查询,结果聚合展示
由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询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<String, Object> map, Map<String, Object> 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();
}
}
}
总结
到此这篇关于java利用Future实现多线程执行与结果聚合的文章就介绍到这了,更多相关java Future实现多线程执行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
沃梦达教程
本文标题为:java利用Future实现多线程执行与结果聚合实例代码
基础教程推荐
猜你喜欢
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现线程插队的示例代码 2022-09-03
- java基础知识之FileInputStream流的使用 2023-08-11
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- Java并发编程进阶之线程控制篇 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- Java数据结构之对象比较详解 2023-03-07
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java实现多人聊天系统 2023-05-19