Выйдите из метода после вызова, но метод должен продолжить обработку отправленного запроса в JAVA - PullRequest
0 голосов
/ 29 июня 2018

Постановка задачи - Я разработал веб-приложение, которое создает набор задач на основе пользовательского ввода и выполняет их на удаленном компьютере. сервер (linux) в последовательном порядке один за другим. Каждое задание занимает около 10 минут. Обычно пользователь отправляет 5 задач в одном запросе, что означает, что веб-приложению требуется около 50 минут, чтобы отобразить сообщение об успехе / неудаче на экране пользователя после подача задания. Я не хочу, чтобы пользователь продолжал ждать 50 минут, чтобы показать результат вывода, вместо этого я хочу отобразить на странице сообщения и ожидаю, что метод должен продолжить обработку переданных данных.

Текущая реализация - Контроллер получит все необходимые данные для подготовки задачи от пользователя и перейдет к классу обслуживания, который создаст список задач - Список и запуск выполнение их, как показано ниже, путем вызова метода executeTask. После того, как завершенное задание выполнено, только я могу показать окончательное сообщение об успехе / неудаче пользователю на данный момент. Но я хотите выйти после вызова executeTask (), передавая taskList и ожидая ниже результата -

1) метод executeTask () должен продолжить обработку отправленных данных даже после выхода из метода.

2) Я отправлю пользователя на страницу успеха с сообщением - Ваш запрос был успешно отправлен. После завершения выполнения задачи вы получите уведомление.

public List<String> executeTask(List<Task> taskList){
        List<String> executionStatusList = new ArrayList<String>();

        Process process = null;

        for( Task task : taskList) {

          try {

                    process = Runtime.getRuntime().exec(task );

                    if (process.waitFor() == 0) {
                        int exitVal = process.exitValue();
                        executionStatusList.add("SUCCESS");

                } else {
                        executionStatusList.add("ERROR");
                break; //Since error occured while processing the task , exiting without processing other task with error status.
                    }
                } catch (IOException ioException) {
                //LOGS
                } catch (InterruptedException intrruptdExcptn) {
                //LOGS
                } finally {
                    if (null != process) {
                        process.destroy();
                        executionStatusList.add("SUCCESS");
                    } else {
                        executionStatusList.add("ERROR");
                       break; //Since error occured while processing the task , exiting without processing other task with error status.
                    }

                }



        }
        return executionStatusList;
    }

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Я использовал подпружиненную асинхронную функцию для достижения заданного требования. Нам нужно добавить асинхронную функцию в метод, который требует времени для обработки. Таким образом, этот конкретный метод будет продолжать работать в фоновом режиме, и мы можем заполнить сообщение Отправить пользователю.

Пример кода

  @EnableAsync
    public class ServiceClassName {

    /**
    *Method which takes long time to process request. Here Need to add @Asyncn
    */
    @Async("asyncExecutor")
    public void methodName ( DataaType inputParam) {

    //Your business logic goes here

    //If you want to return something, then do link  as below-
    //return CompletableFuture.completedFuture(returnValue);
    }

    }
0 голосов
/ 29 июня 2018

Почему вы не создаете новый поток, который работает асинхронно, и отправляете ответ 200 ok клиенту? Используйте это, чтобы сказать, что запрос отмечен, и вы получите письмо по электронной почте. Или я что-то упустил?

...