GetResultTask.java
package com.cwp.data.service.service.task;
import com.cwp.data.intelligence.common.exception.RRException;
import com.cwp.data.service.entity.DataServiceDetail;
import com.cwp.data.service.entity.DataServiceParamDetail;
import com.cwp.data.service.service.strategy.IServiceDataSourceStragety;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
import java.util.concurrent.Callable;
/**
* @ClassName GetResultTask
* @Description TODO
* @Author Getech
* @Date 2021/5/8 11:01
*/
public class GetResultTask implements Callable<List<JSONObject>> {
private IServiceDataSourceStragety dataSourceStragety;
private DataServiceDetail dataServiceDetail;
private String executeSql;
public GetResultTask(IServiceDataSourceStragety dataSourceStragety,DataServiceDetail dataServiceDetail, String executeSql){
this.dataSourceStragety=dataSourceStragety;
this.dataServiceDetail=dataServiceDetail;
this.executeSql=executeSql;
}
@Override
public List<JSONObject> call() throws Exception {
List<JSONObject> result=null;
try{
result=dataSourceStragety.getSqlResult(dataServiceDetail,executeSql,200);
}catch (Exception e){
throw new RRException(e.getMessage());
}
return result;
}
}
调用类:AbstractServiceTypeStrategy.java,方法:getTestResult
package com.cwp.data.service.service.strategy;
import com.cwp.data.development.constant.TableDataType;
import com.cwp.data.development.entity.ConfConnect;
import com.cwp.data.development.service.ConfConnectService;
import com.cwp.data.intelligence.common.exception.RRException;
import com.cwp.data.service.constant.DataServiceTestStateEnum;
import com.cwp.data.service.entity.DataServiceDetail;
import com.cwp.data.service.entity.DataServiceParamDetail;
import com.cwp.data.service.mapper.DataServiceDetailMapper;
import com.cwp.data.service.service.factory.ServiceDataSourceStrategyFactory;
import com.cwp.data.service.service.task.GetResultTask;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* @ClassName AbstractServiceTypeStrategy
* @Description TODO
* @Author Getech
* @Date 2021/4/27 19:17
*/
@Slf4j
public abstract class AbstractServiceTypeStrategy {
@Autowired
private ConfConnectService confConnectService;
@Resource
private DataServiceDetailMapper dataServiceDetailMapper;
@Autowired
private ThreadPoolTaskExecutor myExecutor;
/**
* @Description 填充数据服务输入参数值
* @Author chengweiping
* @Date 2021/4/27 19:27
*/
public abstract void fillDataServiceParam(DataServiceDetail dataServiceDetail, List<DataServiceParamDetail> params);
/**
* @Description 测试
* @Author chengweiping
* @Date 2021/4/28 11:23
*/
public final List<JSONObject> test(DataServiceDetail dataServiceDetail, List<DataServiceParamDetail> paramTestVos){
//构建sql
String sql= getExecuteSql(dataServiceDetail,paramTestVos);
System.out.println("构建出来的sql="+sql);
List<JSONObject> result= getTestResult(dataServiceDetail,sql);
return result;
}
/**
* @Description 调用
* @Author chengweiping
* @Date 2021/4/28 11:23
*/
public final List<JSONObject> call(DataServiceDetail dataServiceDetail, List<DataServiceParamDetail> paramTestVos){
//构建sql
String sql= getExecuteSql(dataServiceDetail,paramTestVos);
System.out.println("构建出来的sql="+sql);
List<JSONObject> result= getCallResult(dataServiceDetail,sql);
return result;
}
/**
* @Description 获取数据源执行策略
* @Author chengweiping
* @Date 2021/4/29 13:12
*/
protected IServiceDataSourceStragety getServiceDataSourceStragety(DataServiceDetail serviceDetail){
Integer connectId=serviceDetail.getConnectId();
Integer typeId=null;
System.out.println("数据服务"+JSON.toJSONString(serviceDetail)+",数据源ID="+typeId);
if(connectId!=null&&connectId>0){
ConfConnect confConnect = confConnectService.selectOne(serviceDetail.getConnectId());
if(confConnect!=null){
typeId=confConnect.getTypeId();
}
}else{
typeId=connectId;
}
IServiceDataSourceStragety serviceDataSourceStragety= ServiceDataSourceStrategyFactory.getServiceByType(typeId);
return serviceDataSourceStragety;
}
/**
* @Description 获取结果
* @Author chengweiping
* @Date 2021/4/27 19:48
*/
protected List<JSONObject> getTestResult(DataServiceDetail serviceDetail, String executeSql){
List<JSONObject> result=new ArrayList<>();
Integer serviceTimeOut=null;
try{
//获取数据源执行策略并执行获取结果
IServiceDataSourceStragety serviceDataSourceStragety=getServiceDataSourceStragety(serviceDetail) ;
//注释一下代码,改为异步获取数据,为了解决超时时间需求
// result=serviceDataSourceStragety.getSqlResult(serviceDetail,executeSql,200);
//如果没有设置超时时间,默认给10000毫秒
serviceTimeOut= serviceDetail.getServiceTimeOut()==null?10000:serviceDetail.getServiceTimeOut();
GetResultTask getResultTask=new GetResultTask(serviceDataSourceStragety,serviceDetail,executeSql);
FutureTask<List<JSONObject>> futureTask =new FutureTask(getResultTask);
myExecutor.submit(futureTask);
// getResultTask.wait();
result=futureTask.get(serviceTimeOut, TimeUnit.MILLISECONDS);
serviceDetail.setTestState(DataServiceTestStateEnum.TEST_PASS.getCode());
this.dataServiceDetailMapper.updateById(serviceDetail);
}catch (Exception e){
e.printStackTrace();
serviceDetail.setTestState(DataServiceTestStateEnum.TEST_NOT_PASS.getCode());
this.dataServiceDetailMapper.updateById(serviceDetail);
if (e.getMessage() != null && e.getMessage().contains("Table not found")) {
throw new RRException("测试失败:" + "查询的表不存在");
}
if( e instanceof TimeoutException){
throw new RRException("测试失败:" + "超过服务设置的超时时间"+serviceTimeOut+"毫秒");
}
if (e.getMessage() != null && e.getMessage().contains("Table not found")) {
throw new RRException("测试失败:" + "查询的表不存在");
}
if (e.getMessage() != null && e.getMessage().contains("TimeoutException")) {
throw new RRException("测试失败:" + "连接数据库超时");
}
throw new RRException("测试失败:" + e.getMessage());
}
return result;
}
/**
* @Description 获取结果
* @Author chengweiping
* @Date 2021/4/27 19:48
*/
protected List<JSONObject> getCallResult(DataServiceDetail serviceDetail, String executeSql){
List<JSONObject> result=new ArrayList<>();
try{
//获取数据源执行策略并执行获取结果
IServiceDataSourceStragety serviceDataSourceStragety=getServiceDataSourceStragety(serviceDetail) ;
result=serviceDataSourceStragety.getSqlResult(serviceDetail,executeSql,10000);
}catch (Exception e){
if (e.getMessage() != null && e.getMessage().contains("Table not found")) {
throw new RRException("调用失败:" + "查询的表不存在");
}
if (e.getMessage() != null && e.getMessage().contains("TimeoutException")) {
throw new RRException("调用失败:" + "连接数据库超时");
}
throw new RRException("调用失败:" + e.getMessage());
}
return result;
}
/**
* @Description 构建sql语句
* @Author chengweiping
* @Date 2021/4/27 19:38
*/
public abstract String getExecuteSql(DataServiceDetail dataServiceDetail, List<DataServiceParamDetail> paramTestVos);
}