환경
- Java 1.8
- Spring Boot 2.2.4.RELEASE
- Spring Batch 4.2.1.RELEASE
- Maven
Spring Batch를 설정할때 각종 실행 결과, 파라미터 등의 메타데이터를 RDBMS에 저장하게 되는데, 간단한 배치작업 위주로 동작할때 이 메타데이터는 크게 중요하지 않을때가 있다.
이번에는 메타 데이터를 DB에 저장하지 않는 방법에 대해 남겨보려고 한다.
1. pom.xml에 Dependency 추가
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2. BatchConfigDefaultBatchConfigurer 상속하여 DataSource를 null로 유지
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class BatchConfig extends DefaultBatchConfigurer {
@Override
public void setDataSource(DataSource dataSource) {
//data source를 null로 유지하기 위함
}
}
3. Job 설정
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@RequiredArgsConstructor
public class SimpleJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("job1")
.start(simpleStep1())
.build();
}
@Bean
public Step simpleStep1() {
return stepBuilderFactory.get("job1Step1")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>>>>>>>>> Step1 execution");
return RepeatStatus.FINISHED;
})
.build();
}
}
4. Application 시작시 자동으로 Job이 수행되지 않도록 수정
Application을 시작하게 되면 등록한 모든 잡들이 수행이 되게 되는데, 필자는 CommandLineRunner를 이용하여 수행하고자 하는 Job만 돌리기 위하여 자동 실행 옵션을 제거한다.
## application.properties
spring.batch.job.enabled=false
5. CommandLineRunner 설정
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@EnableBatchProcessing
@SpringBootApplication(
exclude = {
DataSourceAutoConfiguration.class
}
)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequiredArgsConstructor
@Component
class CommandLineStarter implements CommandLineRunner {
private final ApplicationContext context;
private final JobLauncher jobLauncher;
@Value("${job.name}")
private String jobName;
@Override
public void run(String... args) throws Exception {
Job job = context.getBean(jobName, Job.class);
//TODO 커맨드 라인에서 파라미터를 받아 job 파라미터로 넘겨주도록 설정함
jobLauncher.run(job, new JobParameters());
}
}
}
6. 실행
IDE나 터미널에서 수행할때 --job.name=
파라미터를 통해 실행할 잡을 지정하면된다. 이때 JobName은 Job Class의 Bean Name(여기에서는 simpleJob)을 입력하면 된다.
실제 실행은 아래와 같이 하면 된다.
java -jar my-batch.jar --job.name=simpleJob
'OpenSource > Spring' 카테고리의 다른 글
[Spring] Hadoop Kerberos 티켓 갱신 실패 시 해결방법(javax.security.sasl.SaslException: GSS initiate failed) (0) | 2021.07.07 |
---|