java利用Future實(shí)現(xiàn)多線(xiàn)程執(zhí)行與結(jié)果聚合實(shí)例代碼
場(chǎng)景
網(wǎng)站智能問(wèn)答場(chǎng)景,需要對(duì)多個(gè)分類(lèi)查詢(xún),結(jié)果聚合展示
由于每種分類(lèi)都有自己的業(yè)務(wù)邏輯,有的需要查詢(xún)數(shù)據(jù)庫(kù)中間庫(kù),有的需要查詢(xún)elasticsearch搜索引擎,有的需要調(diào)用第三方接口,數(shù)據(jù)查詢(xún)要分開(kāi)進(jìn)行,沒(méi)法一次查詢(xún)搞定
實(shí)際上這幾個(gè)查詢(xún)不相關(guān),可以同時(shí)進(jìn)行,現(xiàn)在串行,使該場(chǎng)景下,智能問(wèn)答返回較慢
解決
最簡(jiǎn)單的邏輯,肯定就是java多線(xiàn)程,將串行改為并行
這樣查詢(xún)返回時(shí)間,就取決于最慢的一個(gè)查詢(xún),返回時(shí)間大大縮短
頁(yè)面返回一般要求三秒內(nèi),實(shí)際項(xiàng)目上我們要求1秒內(nèi)返回,多線(xiàn)程解決了這個(gè)問(wèn)題
下面上代碼,部分截取
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
// 新聞查詢(xún)
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));
//網(wǎng)上服務(wù)
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));
//信息公開(kāi)(isAllSite為true時(shí),搜索所有集合,不區(qū)分集合和站點(diǎn),只根據(jù)dn搜索,有區(qū)分需要的項(xiàng)目可以重寫(xiě)SearchEsServiceImpl類(lèi))
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));
//問(wèn)答知識(shí)庫(kù)(isAllSite為true時(shí),搜索所有集合,不區(qū)分集合和站點(diǎn),有區(qū)分需要的項(xiàng)目可以重寫(xiě)或傳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 {
//網(wǎng)上辦事查詢(xún)調(diào)用接口
// 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();
}
}
}
總結(jié)
到此這篇關(guān)于java利用Future實(shí)現(xiàn)多線(xiàn)程執(zhí)行與結(jié)果聚合的文章就介紹到這了,更多相關(guān)java?Future實(shí)現(xiàn)多線(xiàn)程執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)API接口的完整代碼
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)API接口的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
spring boot org.junit.jupiter.api不存在的解決
這篇文章主要介紹了spring boot org.junit.jupiter.api不存在的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Spring Boot2配置Swagger2生成API接口文檔詳情
這篇文章主要介紹了Spring Boot2配置Swagger2生成API接口文檔詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09

