Выполнить несколько разных запросов с помощью весенней загрузки и спящего режима - PullRequest
0 голосов
/ 25 октября 2019

Мое требование состоит в том, чтобы создать несколько потоков, выполнить запрос и дать окончательный вывод, например 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);
                }

            }));

1 Ответ

1 голос
/ 25 октября 2019

Вам нужно дождаться завершения пула потоков. Что-то вроде ниже после apiQuerylist.forEach должно работать:

addExecutor.shutdown();
// waiting for executors to finish their jobs
while (!addExecutor.awaitTermination(50, TimeUnit.MILLISECONDS));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...