网站智能问答场景,需要对多个分类查询,结果聚合展示
由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elasticarch搜索引擎,有的需要调用第三方接口,数据查询要分开进行,没法一次查询搞定
实际上这几个查询不相关,可以同时进行,现在串行,使该场景下,智能问答返回较慢
最简单的逻辑,肯定就是java多线程,将串行改为并行
这样查询返回时间,就取决于最慢的一个查询,返回时间大大缩短
页面返回一般要求三秒内,实际项目上我们要求1秒内返回,多线程解决了这个问题
下面上代码,部分截取
@autowired private threadpooltaskexecutor taskexecutor;
// 新闻查询 solrpagequeryvo newsqueryvo = new solrpagequeryvo(); beanutil.copyproperties(vo, newsqueryvo); newsqueryvo.tallsite(vo.getallsite()); newsqueryvo.ttypecode(solrpagequeryvo.typecode.articlenews.tostring().concat(",") .concat(solrpagequeryvo.typecode.picturenews.tostring()) .concat(",").concat(solrpagequeryvo.typecode.videonews.tostring())); future<?> newsfuture = taskexecutor.submit(()->lectforask(map, summap, newsqueryvo, "news", context)); //网上服务 futu地名大全re<?> workguidefuture = taskexecutor.submit(()->lectforask(map, summap, vo, "workguide", context)); //留言 solrpagequeryvo messageboardqueryvo = new solrpagequeryvo(); beanutil.copyproperties(vo, messageboardqueryvo); messageboardqueryvo.tallsite(vo.getallsite()); messageboardqueryvo.ttypecode(solrpagequeryvo.typecode.messageboard.tostring()); future<?> messageboardfuture = taskexecutor.submit(()->lectforask(map, summap, messageboardqueryvo, "messageboard", context)); //信息公开(isallsite为true时,搜索所有集合,不区分集合和站点,只根据dn搜索,有区分需要的项目可以重写archesrviceimpl类) solrpagequeryvo publiccontentqueryvo = new solrpagequeryvo(); beanutil.copyproperties(vo, publiccontentqueryvo); publiccontentqueryvo.tallsite(vo.getallsite()); publiccontentqueryvo.ttypecode(solrpagequeryvo.typecode.public_content.tostring()); future<?> publiccontentfuture = taskexecutor.submit(()->lectforask(map, summap, publiccontentqueryvo, "public_content", context)); //问答知识库(isallsite为true时,搜索所有集合,不区分集合和站点,有区分需要的项目可以重写或传fal) solrpagequeryvo knowledgebaqueryvo = new solrpagequeryvo(); beanutil.copyproperties(vo, knowledgebaqueryvo); knowledgebaqueryvo.耄耋老人tallsite(vo.getallsite()); 培训需求调研表 knowledgebaqueryvo.ttypecode(solrpagequeryvo.typecode.knowledgeba.tostring()); future<?> knowledgebafuture = taskexecutor.submit(()->lectforask(map, summap, knowledgebaqueryvo, "knowledgeba", context)); try { knowledgebafuture.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 { workguidefu广西壮族自治区招生考试院ture.get(); } catch (exception e) { e.printstacktrace(); } tabcount = summap.values().size(); map.put("tabcount", tabcount); map.put("nummap", summap);
private void lectforask(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(); } } el if ("workguide".equals(type)) { try { //网上办事查询调用接口 // do something } catch (exception e) { e.printstacktrace(); } } el if ("messageboard".equals(type)) { try { // do something } catch (exception e) { e.printstacktrace(); } } el if ("public_content".equals(type)) { 春秋地图 try { long querycount = archqueryholder.querycount(vo); // do something } catch (exception e) { e.printstacktrace(); } } el if ("knowledgeba".equals(type)) { try { // do something } catch (exception e) { e.printstacktrace(); } } }
到此这篇关于java利用future实现多线程执行与结果聚合的文章就介绍到这了,更多相关javafuture实现多线程执行内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 07:13:28,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/e25e5f4ca1dc7f3a89771301c76df7f7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java利用Future实现多线程执行与结果聚合实例代码.doc
本文 PDF 下载地址:java利用Future实现多线程执行与结果聚合实例代码.pdf
留言与评论(共有 0 条评论) |