2016-07-06 3 views
2

Я разрабатываю веб-приложение с использованием Spring Framework, которое выполняет некоторые задания при запуске приложения, и эти задания состоят главным образом из загрузки данных из CSV и извлечения из них объектов Java. В настоящее время я пытаюсь создать RESTful API с использованием среды Restlet и Spring, и один из запросов должен взять имя задания в качестве параметра и перезапустить это задание, даже если это задание было помечено как COMPLETED, как выполнить перезагрузка задания? Я пробовал использовать метод startNextInstance() в интерфейсе Joboperator для Spring Framework, а также попытался вручную увеличить параметры JobParameters, чтобы исключить исключение jobinstancealrradyrunning?Повторное завершение задания из Spring Framework?

У любого есть фрагмент кода или альтернативная идея о том, как перезапустить Job в Spring Framework, отмеченном как Completed?

Любая помощь будет принята с благодарностью, спасибо!

ответ

0

Из-за условий вы используете я совершенно уверен, что вы используете Spring Batch

С точки Batch вы не можете на самом деле перезапустить ЗАВЕРШЕНА экземпляр или выполнения. Отдельный экземпляр задания определяется параметрами задания. Если вам нужно снова запустить задание с теми же параметрами, одним из способов было бы включить какой-то уникальный параметр, например текущую временную метку, до JobParameters перед запуском.

Так перезапуском завершенная работа будет означать начиная новый экземпляр задания с параметрами похож. Вот немного модифицированный фрагмент код я использовал до этого использует JobLauncher и JobRegistry, чтобы начать новую работу по имени:

@Autowired 
@Qualifier("asyncJobLauncher") 
private JobLauncher asyncJobLauncher; 

@Autowired 
private JobRegistry jobRegistry; 

... 

public JobExecution startJob(String jobName) { 
    Job job; 
    try { 
     job = jobRegistry.getJob(jobName); 
    } catch (NoSuchJobException e) { 
     // handle invalid job name 
    } 

    JobParametersBuilder jobParams = new JobParametersBuilder(); 
    jobParams.addLong("currentTime", System.currentTimeMillis()); 
    // add other relevant parameters 

    try { 
     JobExecution jobExecution = asyncJobLauncher.run(job, jobParams.toJobParameters()); 
     return jobExecution; 
    } catch (JobExecutionAlreadyRunningException e) { 
     // handle instance already running with given params 
    } catch (Exception e) { 
     // handle other errors 
    } 
} 

Надеется, что это помогает, вот некоторые reading о предмете.

+0

Привет, спасибо большое за ответ. Я пробовал код выше, но, к сожалению, часть jobRegistry.getJob (jobName) бросает исключение даже с действительным именем работы. Итак, я пытаюсь понять, что с этим делать. –

+0

Какое исключение вы видите? По крайней мере, вы должны убедиться, что компоненты JobRegistry и JobLauncher существуют в контексте приложения. – jp86

+0

Эй, извините за поздний ответ. Моя JobLauncher настроена неправильно, поэтому она не работает должным образом, но я получил эту работу сейчас, большое спасибо за вашу помощь! –

Смежные вопросы