/* * Copyright 2006-2007 the original author or authors. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package egovframework.rte.bat.core.launch.support; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersInvalidException; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobExecutionNotRunningException; import org.springframework.batch.core.launch.JobInstanceAlreadyExistsException; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.NoSuchJobException; import org.springframework.batch.core.launch.NoSuchJobExecutionException; import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.JobRestartException; import org.springframework.util.Assert; /** * EgovBatchRunner 클래스 * @author 실행환경 개발팀 이도형 * @since 2012.06.28 * @version 1.0 * @see * <pre> * 개정이력(Modification Information) * * 수정일 수정자 수정내용 * ------- -------- --------------------------- * 2012.06.28 이도형 최초 생성 * 2012.07.03 이도형 Job Parameter 변환 메소드 추가 * </pre> */ public class EgovBatchRunner { //Batch Job의 시작, 정지, 재시작에 사용되는 JobOperator private JobOperator jobOperator; //JobExecution 조회 등에 사용되는 JobExplorer private JobExplorer jobExplorer; //가장 최근에 실행된 JobExecution, StepExecution 조회 등에 사용되는 JobRepository private JobRepository jobRepository; /** * EgovBatchRunner 생성자 * JobOperator, JobExplorer, JobRepository를 설정한다. * * @param jobOperator * @param jobExplorer * @param jobRepository */ public EgovBatchRunner(JobOperator jobOperator, JobExplorer jobExplorer, JobRepository jobRepository) { Assert.notNull(jobOperator, "The JobOperator is mandatory"); Assert.notNull(jobExplorer, "The JobExplorer is mandatory"); Assert.notNull(jobRepository, "The JobRepository is mandatory"); this.jobOperator = jobOperator; this.jobExplorer = jobExplorer; this.jobRepository = jobRepository; } /** * JobOperator를 사용할 수 있도록 가져온다. * * @return JobOperator */ public JobOperator getJobOperator() { return jobOperator; } /** * JobExplorer를 사용할 수 있도록 가져온다. * * @return JobExplorer */ public JobExplorer getJobExplorer() { return jobExplorer; } /** * JobRepository를 사용할 수 있도록 가져온다. * * @return JobRepository */ public JobRepository getJobRepository() { return jobRepository; } /** * Batch Job을 시작한다. * @param jobName : Job 이름 * @param jobParameters: String 형태의 Job 파라미터들 * @return Long: JobExecution의 ID * @throws NoSuchJobException * @throws JobParametersInvalidException * @throws JobInstanceAlreadyExistsException */ public Long start(String jobName, String jobParameters) throws NoSuchJobException, JobParametersInvalidException, JobInstanceAlreadyExistsException { return jobOperator.start(jobName, jobParameters); } /** * 정지, 종료되었거나 실패한 Batch Job을 재시작한다. * @param jobExecutionId : JobExecution의 ID * @return Long: JobExecution의 ID * @throws JobInstanceAlreadyCompleteException * @throws NoSuchJobExecutionException * @throws NoSuchJobException * @throws JobRestartException * @throws JobParametersInvalidException */ public Long restart(Long jobExecutionId) throws JobInstanceAlreadyCompleteException, NoSuchJobExecutionException, NoSuchJobException, JobRestartException, JobParametersInvalidException { return jobOperator.restart(jobExecutionId); } /** * 실행 중인 Batch Job을 정지한다. * @param jobExecutionId : JobExecution의 ID * @throws NoSuchJobExecutionException * @throws JobExecutionNotRunningException */ public void stop(Long jobExecutionId) throws NoSuchJobExecutionException, JobExecutionNotRunningException { jobOperator.stop(jobExecutionId); } /** * 실행에 필요한 JobParameters String을 생성한다. * @return JobParameters */ public String createUniqueJobParameters() { Map<String, JobParameter> parameters = new HashMap<String, JobParameter>(); parameters.put("timestamp", new JobParameter(new Date().getTime())); return convertJobParametersToString(new JobParameters(parameters)); } /** * 이미 생성되어 있는 JobParamters String에 JobParameter를 추가한다. * @param jobParameters * @param parameterName : 추가할 JobParamter 이름 * @param parameterValue : 추가할 JobParamter 값 * @return String 형태의 JobParamters */ public String addJobParameter(String jobParameters, String parameterName, String parameterValue) { String delim = ""; if(!"".equals(jobParameters)) { delim = ","; } return jobParameters.concat(delim).concat(parameterName).concat("=").concat(parameterValue); } /** * JobParamters를 String으로 변환한다. * @param jobParamters * @return String으로 변환된 JobParamters */ public String convertJobParametersToString(JobParameters jobParamters) { String convertedJobParameters = jobParamters.toString(); if(convertedJobParameters.startsWith("{")) { convertedJobParameters = convertedJobParameters.substring(1); } if(convertedJobParameters.endsWith("}")) { convertedJobParameters = convertedJobParameters.substring(0, (convertedJobParameters.length()-1)); } return convertedJobParameters; } /** * 여러건의 등록된 Job을 조회한다. * @return Set<String> : Job 이름 목록 */ public Set<String> getJobNames() { return jobOperator.getJobNames(); } /** * JobExecution ID로 JobExecution를 조회한다. * @param jobExecutionId : JobExecution의 ID * @return JobExecution */ public JobExecution getJobExecution(Long jobExecutionId) { return jobExplorer.getJobExecution(jobExecutionId); } /** * JobExecution ID로 JobExecution를 조회한다. * @param jobExecutionId : JobExecution의 ID * @return List<JobExecution> : JobExecution 목록 */ public List<JobExecution> getJobExecutions(Long jobExecutionId) { return jobExplorer.getJobExecutions(getJobInstance(jobExecutionId)); } /** * 마지막으로 수행된 JobExecution를 조회한다. * @param jobName : Job 이름 * @param jobParameters : Job 파라미터들 * @return List<JobExecution> : JobExecution 목록 */ public JobExecution getLastJobExecution(String jobName, JobParameters jobParameters) { return jobRepository.getLastJobExecution(jobName, jobParameters); } /** * 마지막으로 수행된 StepExecution를 조회한다. * @param jobExecutionId : JobExecution의 ID * @param stepName : Step 이름 * @return List<JobExecution> : JobExecution 목록 */ public StepExecution getLastStepExecution(Long jobExecutionId, String stepName) { return jobRepository.getLastStepExecution(getJobInstance(jobExecutionId), stepName); } /** * JobExecution ID로 JobInstance를 조회한다. * @param jobExecutionId : JobExecution의 ID * @return JobInstance */ public JobInstance getJobInstance(Long jobExecutionId) { return getJobExecution(jobExecutionId).getJobInstance(); } }