1スレッドの実行結果を取得するためにsubmitSqlコントローラ層、getResultメソッドを使用して、それぞれのSQLメソッドを登録します
dataService.submitSql(uuid,endsql);
return dataService.getResult(uuid);
実行するSQL文のENDSQLは、UUIDは一意エントリスレッド情報を識別しています。
2.情報サービス層は、スレッドプール、およびマルチスレッド実行における方法を定義しています。
2.1定義スレッドプール情報及び結果フォーマット。
public static ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10, 5,TimeUnit.MINUTES,new ArrayBlockingQueue<>(5));
public static HashMap<String, Future<List<LinkedHashMap<String, Object>>>> resultList = new HashMap<String, Future<List<LinkedHashMap<String, Object>>>>();
2.2呼び出し可能な実現方法
public static class SqlTask implements Callable<List<LinkedHashMap<String, Object>>> {
private String sql;
private DataMapper dataMapper;
public SqlTask(String sql, DataMapper dataMapper) {
this.sql=sql;
this.dataMapper=dataMapper;
}
@Override
public List<LinkedHashMap<String, Object>> call() throws Exception{
DBIdentifier.setProjectCode(projectCode);
List<LinkedHashMap<String,Object>> res=dataMapper.getPublicItems(sql);
System.out.println("处理sql:"+sql);
return res;
}
}
2.3 SQL文では、タスクに提出しました
public void submitSql(String uuid,String sql){
Future<List<LinkedHashMap<String, Object>>> result = executor.submit(new SqlTask(sql,dataMapper));
resultList.put(uuid,result);
}
2.4の結果を得る方法
public CloudwalkResult getResult(String uuid) throws InterruptedException {
Future f = resultList.get(uuid);
if(f!=null){
while(!f.isDone()){
Thread.sleep(100);
System.out.println("还没有执行完....");
}
System.out.println("执行完毕");
List<LinkedHashMap<String, Object>> r = null;
try {
r = (List<LinkedHashMap<String, Object>>) f.get();
resultList.remove(uuid);
} catch (Exception e) {
return CloudwalkResult.fail("1",e.getMessage());
}
return CloudwalkResult.success(r);
}else{
System.out.println("任务不存在");
}
return null;
}