Мое требование состоит в том, чтобы создать несколько потоков, выполнить запрос и дать окончательный вывод, например Map<String,List<Object>>;
Карта содержит строку имени таблицы, а List<Object>
- это вывод запроса, содержащий список записей таблицы.
Требование:
У меня есть одна таблица, которая содержит список полей, таких как TableName и Query
Например.
нанимать |выбрать * из найма;этот запрос имеет более 100000 записей Employ_Detail |выберите * из Employ_detail;этот запрос имеет более 300000 записей EmployeSsary |выберите * из employee_salary;в этом запросе более 600000 записей
В приведенной выше таблице может быть 10 000 запросов
Я хочу создать один API для этого запроса, используя пружинный загрузчик + спящий режим.
Моя проблема:
Я хочу создать одно решение с многопоточностью с использованием JAVA 8.
@RestController
public class ApiQueries {
@RequestMapping(value = "/getAllQueries", method = RequestMethod.GET)
public CommonDTO getAllQuery(){
list=apiQueryService.findAll();
if(null!=list){
objectMap= apiQueryService.executeQueryData(list); //here apiQueryService have one method named is executeQuery()
}
}
}
Я написал приведенную ниже логику в том, чтометод.
@Override
public Map<String,List<Object>> executeQueryData(List<ApiQueries>
apiQuerylist, String fromDate, String toDate) {
addExecutor = new ThreadPoolExecutor(3, 5, 10, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
List<Object> obj=null;
Map<String,List<Object>> returnMap=new HashMap<String,List<Object>>();
try {
if(session==null) {
session = sessionFactory.openSession();
}
apiQuerylist.forEach(list-> addExecutor.execute(new Runnable() {
@Override
public void run() {
apiQueryObject = session.createSQLQuery(list.getQuery()).list();
returnMap.put(list.getTableName(), apiQueryObject);
}
}));
}catch(Exception ex) {
System.out.println("Inside [B] Exception "+ex);
ex.printStackTrace();
}finally {
if(session !=null) {
session.close();
}
}
return returnMap;
}
Проблема в том, что когда я вызываю api, приведенный ниже код будет работать в фоновом режиме, а этот метод возвращает нулевой объект, но в фоновом режиме я увижу список запросов, которые выполняются один за другим
apiQuerylist.forEach(list-> addExecutor.execute(new Runnable() {
@Override
public void run() {
apiQueryObject = session.createSQLQuery(list.getQuery()).list();
returnMap.put(list.getTableName(), apiQueryObject);
}
}));