묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 배치
이클립스에서 아무리 Application을 실행해도 잡이 실행이 안됩니다.
구글링도 많이해보고 질문 게시판도 많이 뒤져봤는데, 강사님이 작성해주신 그대로 Job을 작성했지만, Application 을 실행하면 그냥Started SpringBatchApplication in 1.373 seconds (process running for 2.321)이 실행되었다고만 뜨고 Job은 돌지 않습니다 ........ 따로 설정해주어야 하는 것이 있나요? Application 파일 위에 @EnableBatchProcessing 도 다 붙여놓은 것 확인하였습니다 제 코드는 여기 있습니다.https://github.com/SMJin/Spring-batch
-
해결됨스프링 배치
트랜잭션 경계 와 트랜잭션 begin에 대한 구분
안녕하세요 정수원 선생님 질문이 2개 있습니다.1) "Chunk Process 아키텍처" 첫번째 사진 설명부분 4:26쯤에 트랜잭션 경계와 실제 트랜잭션 begin을 구분하셨는데 이것이 무슨 차이인가요?아니면 어떻게 받아들여야하는것인가요? 2) 또한 코드를 디버깅 걸어서 따라가보니 TaskletStep#doInChunkContext 에서 new TransactionTemplate.execute() 에서 매 chunk마다 트랜잭션이 시작되는것은 확인하였는데 그림에 나온것 처럼 SImpleChunkProvider 다음과정에서 Transaction 시작하는곳을 찾지 못하겠습니다...
-
해결됨스프링 배치
JdbcBatchItemWriter Query
안녕하세요 선생님!JdbcBatchItemWriter 에서 발생하는 Query 가batch query 로 나가지 않는 것 같아서 질문 드립니다! 혹시 jdbc 에서 batch query 로 보내더라도 optimizer 에 의해단일쿼리로 변경되어서 나갈수도 있나요?! 감사합니다. 위 사진은 MySQL 의 Query Log 입니다. 제 설정은 아래와 같습니다@Configuration class HelloJobConfiguration( private val jobBuilderFactory: JobBuilderFactory, private val stepBuilderFactory: StepBuilderFactory, private val dataSource: DataSource, ) { @Bean fun job(): Job { return jobBuilderFactory.get("job") .incrementer(RunIdIncrementer()) .start(step1()) .build() } @Bean fun step1(): Step { return stepBuilderFactory.get("step1") .chunk<Customer, Customer>(5) .reader(customItemReader()) .writer(customItemWriter()) .build() } @Bean fun customItemReader(): ItemReader<Customer> { return JdbcPagingItemReaderBuilder<Customer>() .name("jdbcPagingItemReader") .dataSource(dataSource) .pageSize(5) .rowMapper(BeanPropertyRowMapper(Customer::class.java)) .queryProvider(queryProvider()) .build() } @Bean fun queryProvider(): PagingQueryProvider { return SqlPagingQueryProviderFactoryBean().apply { setDataSource(dataSource) setSelectClause("SELECT id, firstName, lastName, birthdate") setFromClause("FROM customer") setSortKeys(mapOf("id" to Order.ASCENDING)) }.`object` } @Bean fun customItemWriter(): ItemWriter<Customer> { return JdbcBatchItemWriterBuilder<Customer>() .dataSource(dataSource) .sql("INSERT INTO customer2 values(:id, :firstName, :lastName, :birthdate);") .beanMapped() .build() } }
-
해결됨스프링 배치
cursor 동작원리
안녕하세요 선생님.https://www.inflearn.com/questions/341918 좋은 강의 잘 듣고있습니다! 감사합니다. 안녕하세요 선생님.비슷한 고민을 하다가 이 질문을 찾아오게 되었는데요,예를들어 1000 건의 데이터가 있고, 100건씩 데이터를 처리하려고 하더라도실제로 SQL 자체는 단 한번 실행되고,데이터베이스 서버에서 해당 resultSet 을 가지고있으면서cursor 를 batch application 으로 반환하고,cursor 를 통해서 필요시 DB server 에 실제 데이터를 요청한다고 이해했습니다. (그리고 받은걸 메모리에 올려서 작업) 그러면 결국 DB 서버에서는 그 많은 데이터를 전부 메모리에 올려놓고 batch 작업이 종료될 때까지 유지해야한다고 이해했는데, 혹시 제가 이해한게 맞나요?!
-
미해결스프링 배치
ItemStream의 open 메서드 관련 궁금합니다
안녕하세요 강사님~먼저 질좋은 강의를 만들어주셔서 감사합니다 :)ItemStream 관련 궁금증이 생겨 질문드리게 되었는데요!public void open(ExecutionContext executionContext)위 메서드의 ExecutionContext 는 Step의 ExecutionContext 로 이해했습니다.그런데 Step 중간에 오류가 발생할 경우. 전체 Job이 실패하고.JobExecution & JobExecutionContext 가 새로 생성되며, 해당 Step의 StepExecution & StepExecutionContext 또한 새로 생성되어. 재시작전의 StepExecutionContext 에 저장해둔 index 는 꺼내어 사용 못하는게 아닌가요..?!재시작 후에 ExecutionContext 에서 index를 가져올 수 있는 부분이 헷갈립니다ㅜ추가로 index 예제는 ItemStream 통한 복구대비를 해두어. 재시작시 오류가 발생한 Chunk의 item부터 이어서 처리할 수 있었는데요.ItemStream 없이 ItemReader 만 사용할 경우는 트랜잭션 커밋되어 반영된 Chunk 가 있어도 무시하고 처음 Chunk 부터 다시 작업을 하게되는걸까요?
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
Chunk size에 대해
안녕하세요.코드를 보면 Step을 만들 때, .<Orders, Accounts>chunk(5) 와 같이 chunk size를 5로 지정했는데요.ItemReader에서도 PageSize를 5개로 지정했습니다.그리고 실제로 배치를 실행하면 정상적으로 동작합니다.하지만, 로그를 보면 select와 insert가 섞여있는데요.5개씩 실행되는게 어느 단위인지 궁금합니다.1. Reader에서 5개를 읽어온다.2. 5개를 Processcor에서 처리한다.3. 5개를 Writer에서 DB에 작성한다.저는 위와 같은 방식이라고 생각했는데, 어떤게 맞는건가요?좋은 강의 감사합니다!
-
해결됨스프링 배치
job execution에 stopped status가 안나타납니다.
안녕하세요 정수원 선생님 현재 Part.4.3.1.3.3 branch에서 mysql db로 실행시켰을때step execution 에서 step1,step2 의 batch status는 각각 completed 이고exit code는 각각 Failed , Pass인 상태입니다. 하지만 job execution에는 status , exitcode 둘다 모두 failed 인상태입니다. 왜 job execution이 stopped로 안나타는지 알 수 있을까요? addDanglingEndStates 에서 끝나는 시점에 transitions에 2개가 추가 되어서 그런것일까요? 4를 타야할 것같은데 뭔가 5를 타는것같습니다.5,6은 StepState:name=[batchJob.step1] 시점에서 !hasFail 분기를 타고 추가된것입니다.
-
미해결스프링 배치
optionalKeys, requiredKeys
안녕하세요 20:00 부분입니다 옵셔널 키는 없어도 된다고 앞에서 해주셨는데왜 체크를 하는건가요 ?!
-
해결됨스프링 배치
Child Job 2번실행되는것에 관한 질문입니다.
안녕하세요 정수원 선생님저도 2번 실행되서 디버깅 해보니 ChildJob까지 @Bean으로 등록하면 JobLauncherApplicationRunner#executeLocalJobs에 ParentJob, ChildJob 이렇게 2개가 등록이 됩니다.그래서 ParentJob 실행할때 child 한번또 다시 child 실행총 2번이 진행된것을 확인 할 수 있었습니다. ChildJob을 @Bean등록을 해제하면 되는데 보통 이렇게 사용하는것이 맞나요?
-
미해결스프링 배치
spring batch 트랜잭션 질문입니다.
아래 설명해주신것처럼 스프링배치에서 외부에서 @Transactional 을 쓰는것을 허용하지 않는다는것을 확인했습니다.https://brunch.co.kr/@anonymdevoo/50여기를보고 semaphore.acquire를 하고 외부 트랜잭션이 끝나지 않아서 afterCompletion에서 해당 semaphore.release를 호출하지 못한다는것을 확인하였습니다.하지만 아래처럼@RequiredArgsConstructor @Configuration public class TaskletStepConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) .start(taskStep()) .next(chunkStep()) .build(); } @Bean @Transactional public Step taskStep() { return stepBuilderFactory.get("taskStep") .tasklet((contribution, chunkContext) -> { System.out.println("step1 has executed"); return RepeatStatus.FINISHED; }) .build(); } @Bean @Transactional public Step chunkStep() { return stepBuilderFactory.get("chunkStep") .<String, String>chunk(3) .reader(new ListItemReader(Arrays.asList("item1","item2","item3"))) .processor(new ItemProcessor<String, String>() { @Override public String process(String item) throws Exception { return item.toUpperCase(); } }) .writer(list -> { list.forEach(item -> System.out.println(item)); }) .build(); } } @Transactional을 걸어도 잘 동작하는데 제가 놓친 부분이있을까요?디버깅을 거며 확인했는데도 잘 모르겠습니다..브랜치는 4.2.4.1입니다.
-
미해결스프링 배치
스키마설정
안녕하세요 강의 초반이지만 대박강의네요 질문이 하나 있습니다배치 설정중에 initialize-schema: never네버라는 설정은 누가 실수로 스키마를 사용할까봐안전 장치용으로 만들어진건가요??(개인적인 생각입니다)
-
미해결스프링 배치
스프링배치와 쿼츠의 연동 질문
안녕하세요, 실무에서 스프링배치를 처음 접하게 되어 알아보던 중 강사님의 강의가 신뢰할 수 있다고 생각되어 신청하였어요. 너무 잘 듣고 있습니다! 다만 강의를 듣다 추가적으로 궁금한 사항이 생겨서 여기저기 찾아보았는데 해결 방법을 찾지 못해 질문을 남깁니다실전예제를 따라하는 과정에서 quartz와 함께 스케줄링을 하는 부분을 보았는데, quartz의 경우 spring batch처럼 메타데이터를 테이블에서 관리할 수 있도록 하는 기능이 있어 해당 설정을 추가하였습니다.spring: quartz: job-store-type: jdbc이렇게 했을 경우 quartz 테이블에 자동으로 JobDetail 및 Trigger 등의 정보가 insert 되어야 할 것 같은데 안 되더라구요, 또한 기존에 작동하던 spring batch의 job이 실행이 되지 않습니다.quartz와 더 관련있는 부분이라 강의 내용과 조금 다른 부분일 거라는 생각에 질문이 조심스러웠지만 해결하고 싶은 마음에 이곳에 글을 남깁니다!
-
미해결스프링 배치
adapter
외부 서비스 호출을 하려면adapter를 사용해야 하는지요?맞다면 청크와 태스크릿 모두 사용이 가능한지와예제 소스 브랜치명 부탁드립니다.
-
미해결스프링 배치
5.0 버전으로 마이그레이션
기존에 하던 프로젝트의 스프링 버전이 3.0.0이라 배치의 버전 또한 5.0을 사용하게 됐습니다. excute 메소드가 실행되지 않는 이유를 알 수 있을까요..??package com.jojoldu.book.freelecspringbootwebservice.config; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableBatchProcessing @RequiredArgsConstructor public class HelloJobConfiguration extends DefaultBatchConfiguration { @Bean public Job myJob(JobRepository jobRepository, Step myStep1, Step myStep2) { System.out.println("this is job"); return new JobBuilder("myJob", jobRepository) .start(myStep1) .next(myStep2) .build(); } @Bean public Step myStep1(JobRepository jobRepository) { System.out.println("this is step1"); return new StepBuilder("myStep1", jobRepository) .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("step1 started"); return RepeatStatus.FINISHED; } }, getTransactionManager()) .build(); } @Bean public Step myStep2(JobRepository jobRepository) { System.out.println("this is step2"); return new StepBuilder("myStep2", jobRepository) .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("step2 started"); return RepeatStatus.FINISHED; } }, getTransactionManager()) .build(); } }
-
미해결[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch
Run / Debug 관련 질문드립니다..!
앞선 질문 보고 다음과 같이 추가를 한 상황인데 Hello World Spring Batch 구문이 실행이 되지 않아 질문을 드립니다..! 혹시 제가 잘못 설정한 부분이 있는 걸까요?
-
미해결스프링 배치
전역변수질문
전역 변수가 리더에서만 리스너 참조하니까 읽히고 프로세서와 라이터에선 안 읽힙니다. 왜 그런걸까요
-
미해결스프링 배치
자료공유 질문
ppt자료는 공유 해도 무방한가요?
-
미해결스프링 배치
Multi-threaded과 Partitioning의 차이가 있나요?
Multi-threaded에다가 각 스레드가 담당할 데이터를 구분시켜주는 기능이 포함된게 Partitioning인가요??단지 차이점이 이렇게만 느껴집니다
-
미해결스프링 배치
AsyncItemReader
AsyncItemReader는 없는 이유가 있나요?읽는거도 비동기처리하면 그만큼 또 메인스레드를 다른용도로 활용할 수 있으니까요
-
미해결스프링 배치
소스코드질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 배포해주신 git에 수업하신 모든 코드가 없고 기본 코드만 있는것 같네요 수업의 모든 코드는 어디서 받나요?