注意红色字体部分
业务需求:数据可能来自不同的数据源,mysql,oracle,或者远程接口(分为两个实现类:数据和api)
用线程池调用
1.service层核心代码:
@Autowired
//数据和api的实现类,继承AbstractDataHanderService,AbstractDataHanderService为抽象类,
private Map<String,AbstractDataHanderService> handerServiceMap;
private ThreadPoolExecutor threadPool;
//下面初始化线程池
@PostConstruct
private void initThreadPool(){
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("engine-%d").setDaemon(true).build();
threadPool = new ThreadPoolExecutor(20,32,50L,,new LinkedBlockingQueue<Runnable>(32),threadFactory);
();
}
@Override
public List<IndicatorDataRespDTO> getIndicatorData(IndicatorReqDTO reqDTO,userCode){
.....省略部分代码
List<IndicatorDataDTO> dataDtoList = new ArrayList<>(); // 返回的结果
List<Future<List<IndicatorDataDTO>>> futures = new ArrayList<>(); //有返回结果的线程用future接收
for(){
//遍历调用数据或api的实现类,()就是得到实现service,
//getHandlerList方法封装要执行的对象
List<AbstractGetDataHandler> handerList = (()+"_dataHandlerService")
.getHandlerList(reqDTO,(),getGroupReqFields());
((handlerList));//这一步是真正的执行,执行的是上一步封装对象里的方法
}
//合并结果数据
for(Future<List<IndicatorDataDTO>> future:futures){
List<IndicatorDataDTO> resultDataList = ();
if(!(resultDataList)){
(resultDataList);
}
}
}
2. 注意上一段代码封装的执行对象 List<AbstractGetDataHandler> handerList =
和List<Future<List<IndicatorDataDTO>>> futures = new ArrayList<>(); //有返回结果的线程用future接收
AbstractGetDataHandler 抽象类:注意这里实现implements Callable<List<IndicatorDataDTO>>
@Slf4j
@Data
public abstract class AbstractGetDataHandler implements Callable<List<IndicatorDataDTO>>{
public abstract List<IndicatorDataDTO> getIndicatorData(); //处理业务在这个方法的实现里面,
//注意这个方法的返回List<IndicatorDataDTO>和List<Future<List<IndicatorDataDTO>>> futures = new ArrayList<>();
}
3.实现类里getHandlerList方法核心代码
//返回List<AbstractGetDataHandler> dataHandlerList
//这里注意DataBaseGetDataHandler 继承了上面AbstractGetDataHandler ,并实现了getIndicatorData方法
//
(new DataBaseGetDataHandler(jdbcTemplate,paramMap,dataPath,type,engineDbConfig));
4.DataBaseGetDataHandler
@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DataBaseGetDataHandler extends AbstractGetDataHander{
//实现 getIndicatorData ,在这里业务处理
@Override
public List<IndicatorDataDTO> getIndicatorData(){
。。。。。。
}
//注意下面这个方法,重点!
@Override
public List<IndicatorDataDTO> call() thows Exception{
return getIndicatorData
}
}