Authored by unknown

future

package com.yoho.search.service.servicenew.scene;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.BiFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -14,7 +18,6 @@ import com.yoho.search.service.servicenew.IProductIndexService;
import com.yoho.search.service.servicenew.scene.common.AbstractSceneService;
import com.yoho.search.service.servicenew.scene.common.SceneProductListService;
import com.yoho.search.service.servicenew.scene.common.SceneSelectionsService;
import com.yoho.search.service.utils.SearchApiResultUtils;
import com.yoho.search.service.vo.SearchApiResult;
@Service
... ... @@ -35,22 +38,34 @@ public class SortSceneService extends AbstractSceneService {
public String pageId() {
return SearchPageIdDefine.PAGE_ID_SORT;
}
private ExecutorService executorService = Executors.newFixedThreadPool(100);
private SearchApiResult getErrorResults(String message) {
return new SearchApiResult().setData(new JSONObject()).setCode(500).setMessage(message);
}
@Override
public SearchApiResult productList(Map<String, String> paramMap) {
try {
// 1、获取商品列表
SearchApiResult productList = splitProductListService.productList(paramMap);
// 2、返回规则聚合结果
SearchApiResult standards = productIndexService.aggStandard(paramMap);
JSONObject results = (JSONObject)productList.getData();
results.put("standards", standards.getData());
// 3、返回最终结果
return new SearchApiResult().setData(results);
} catch (Exception e) {
logger.error("[func=sortProductList][params=" + paramMap + "]", e);
return SearchApiResultUtils.errorSearchApiResult("sortProductList", paramMap, e);
}
CompletableFuture<SearchApiResult> productList = CompletableFuture.supplyAsync(() -> {
return splitProductListService.productList(paramMap);
},executorService);
CompletableFuture<SearchApiResult> standards = CompletableFuture.supplyAsync(() -> {
return productIndexService.aggStandard(paramMap);
},executorService);
productList.get();
standards.get();
CompletableFuture<SearchApiResult> results = productList.thenCombine(standards, new BiFunction<SearchApiResult, SearchApiResult, SearchApiResult>() {
@Override
public SearchApiResult apply(SearchApiResult productList, SearchApiResult standardsAggregations) {
JSONObject jsonObject = (JSONObject) productList.getData();
jsonObject.put("standards", standardsAggregations.getData());
return productList;
}
});
return results.get();
}
@Override
... ...
... ... @@ -10,6 +10,8 @@ import javax.annotation.PostConstruct;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ... @@ -31,6 +33,8 @@ import com.yoho.search.service.vo.SearchApiResult;
@Service
public class SceneProductListService extends BaseService {
private static final Logger logger = LoggerFactory.getLogger(SceneProductListService.class);
@Autowired
private SearchCommonHelper searchCommonHelper;
... ... @@ -61,36 +65,41 @@ public class SceneProductListService extends BaseService {
* @return
* @throws Exception
*/
public SearchApiResult productList(Map<String, String> paramMap) throws Exception {
// 1)构造搜索参数
SearchParam searchParam = this.buildProductListSearchParam(paramMap);
public SearchApiResult productList(Map<String, String> paramMap){
try {
// 1)构造搜索参数
SearchParam searchParam = this.buildProductListSearchParam(paramMap);
// 2)从缓存中获取数据
final String indexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
JSONObject cacheObject = searchCacheService.getJSONObjectFromCache(searchCache, indexName, searchParam);
if (cacheObject != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("/split/productList.json", paramMap);
return new SearchApiResult().setData(cacheObject);
}
// 2)从缓存中获取数据
final String indexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
JSONObject cacheObject = searchCacheService.getJSONObjectFromCache(searchCache, indexName, searchParam);
if (cacheObject != null) {
SearchCacheMatchLogger.doSearchCacheMatchLog("/split/productList.json", paramMap);
return new SearchApiResult().setData(cacheObject);
}
// 3)查询ES
SearchResult searchResult = searchCommonService.doSearch(indexName, searchParam);
if (searchResult == null) {
return new SearchApiResult().setCode(500).setMessage("execption");
}
// 3)查询ES
SearchResult searchResult = searchCommonService.doSearch(indexName, searchParam);
if (searchResult == null) {
return new SearchApiResult().setCode(500).setMessage("execption");
}
// 4)构造返回结果
JSONObject dataMap = new JSONObject();
dataMap.put("total", searchResult.getTotal());
dataMap.put("page", searchResult.getPage());
dataMap.put("page_size", searchParam.getSize());
dataMap.put("page_total", searchResult.getTotalPage());
List<Map<String, Object>> product_list = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList(), null);
dataMap.put("product_list", this.moveProductListSort(paramMap, product_list));
// 5)将结果存进缓存
searchCacheService.addJSONObjectToCache(searchCache, indexName, searchParam, dataMap);
return new SearchApiResult().setData(dataMap);
// 4)构造返回结果
JSONObject dataMap = new JSONObject();
dataMap.put("total", searchResult.getTotal());
dataMap.put("page", searchResult.getPage());
dataMap.put("page_size", searchParam.getSize());
dataMap.put("page_total", searchResult.getTotalPage());
List<Map<String, Object>> product_list = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList(), null);
dataMap.put("product_list", this.moveProductListSort(paramMap, product_list));
// 5)将结果存进缓存
searchCacheService.addJSONObjectToCache(searchCache, indexName, searchParam, dataMap);
return new SearchApiResult().setData(dataMap);
} catch (Exception e) {
logger.error(e.getMessage(),e);
return new SearchApiResult().setData(null).setCode(500).setData("productList Exception");
}
}
/**
... ...