Понимание запуска пакетных заданий Spring в веб-контейнере - PullRequest
1 голос
/ 04 октября 2011

Я читал документацию Spring Batch, когда натолкнулся на тот факт, что нам придется использовать другую реализацию интерфейса TaskExecutor (асинхронная версия), если мы будем эффективно запускать пакетные задания извеб-контейнер.

Я предполагаю, что запрос Http вызовет пакетное задание.И, насколько я понимаю, когда клиент запускает задание с помощью метода run интерфейса JobLauncher , клиент должен ждать возврата объекта JobExecution и после типичногопакетное задание будет выполняться часами в конце, это может быть не очень выполнимо, если задания выполняются синхронно.Теперь AsyncTaskExecutor будет выполнять каждый шаг в отдельных потоках и немедленно вернет объект JobExecution со статусом UNKNOWN.

Во-первых, может кто-нибудь объяснить мне, как это работает с точки зрения клиент-сервер соединение ?В каждом случае, не будет ли клиент ждать завершения пакета, прежде чем он завершит сеанс?Или клиент не знает о состоянии завершения пакетного задания?Вся проблема связана с тем, что соединение должно оставаться до конца пакета?

В качестве примера, скажем, клиент имеет веб-страницу, которая отправляет HTTP-запрос на получение, который обслуживается методом doget сервлета.Этот метод вызывает run метод запуска задания.Этот метод возвращает объект JobExecution .А остальная часть истории такая же, как и выше.

Спасибо, Адитья.

Ответы [ 2 ]

4 голосов
/ 04 октября 2011

Это немного зависит от того, что делает ваш сервлет после того, как он вызвал метод run и получил взамен объект JobExecution.Я предполагаю, что метод doget просто возвращается после вызова run.

Если вы выполняете not , используйте асинхронный исполнитель для вызова метода run на панели запуска заданийбудет выполняться синхронно.То есть вызов будет ожидать, пока пакетное задание не будет выполнено и объект JobExecution не будет возвращен.С точки зрения соединения, HTTP-соединение клиента будет оставаться открытым в течение всего пакетного задания.HTTP-соединение будет закрыто при возврате метода doGet сервлета (или раньше, если на каком-то уровне встречается таймаут, например, брандмауэр или таймаут чтения сокета).

Если вы используете асинхронный исполнитель, вызовк методу run вернется сразу.Метод doGet вернется после этого, HTTP-ответ будет отправлен клиенту, и соединение будет закрыто (при условии, что HTTP-активности не поддерживается).

0 голосов
/ 19 июня 2017

Запуск заданий из веб-контейнера

Обычно задания запускаются из командной строки.Однако во многих случаях запуск с HttpRequest является лучшим вариантом.Многие из таких вариантов использования включают в себя создание отчетов, выполнение специальных заданий и поддержку веб-приложений.Поскольку пакетное задание по определению является длительным, наиболее важной задачей является обеспечение асинхронного запуска задания:

enter image description here

Здесь контроллер Spring MVC запускает заданиеиспользуя JobLauncher, который был настроен для асинхронного запуска, который немедленно возвращает JobExecution.Задание, скорее всего, все еще будет работать, однако это неблокирующее поведение позволяет контроллеру немедленно вернуться, что требуется при обработке HttpRequest.

Пример ниже:

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}

источник

...