월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 배치
Add connection elided, waiting 1, queue 2 오류 발생
강사님 안녕하세요 오류 관련 문의드립니다. 현재 제가 작성한 잡에서 MultiThreaded Step, Flow, AsyncProcessor, AsyncWriter기능을 동시에 사용하고 있는데요, 하기와 같은 오류가 발생하였습니다. Add connection elided, waiting 1, queue 2 이런 케이스는 어떻게 해결해야할까요? 답변 부탁드립니다. 감사합니다.
- 미해결스프링 배치
문의드립니다^^
안녕하세요! 강사님 Spring Batch를 공부하고 싶어서 강사님의 강의를 수강하게 되었습니다:) 다름이 아니라 공부한 내용을 정리하여 제가 운영하고 있는 블로그에 정리하고 싶은데요. 게시물에는 강사님의 강의 URL과 함께 강의명을 출처로 함께 명시하려고 합니다. 혹시 개인 블로그에 글을 게시도 괜찮을지 문의드립니다.
- 미해결스프링 배치
Redis cluster 와의 연동은 어떨까요?
안녕하세요. jdbc 등은 사용하지않고 redis cluster 를 케시디비로 사용하여 step 에 서 동작하도록 추가하고자합니다. Srping-batch 에서도 redis 를 사용하는 내용은 어떤내용을 참고하면 좋을까요?
- 미해결스프링 배치
청크 배치 관련 write commit 및 rollback 관련 질문있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 청크 프로그램으로 itemReader 에서 데이터를 조회 한후에 itemWriter로 데이터를 보낸후 데이터를 insert 처리를 합니다. 보통 청크 사이즈가 5이라고 하면 리드를 10건 했다면 write는 5건 단위로 커밋 및 롤백하는것으로 알고있는데요 만약에 리드를 10건으로 entity로 했고 entity안에 리스트 엔티티로 데이터가 1000건 있다면 write 할때는 어떤식으로 commit 및 롤백 처리 되나요? 기존 대로 5건씩 처리 되는건가요? customerItemWriter를 이용하여 리스트로 받고 for문을 이용하여 insert 및 update 합니다. for문으로 entity를 청크 사이즈 만큼 5건을 읽는데 entity에 list가 있어서 또 for 문으로 1000건을 돌려서 insert나 update 처리해야 되는경우입니다 public class TranPayObjectDto { private String clamUniqNo; private String fromDate; private String toDate; private String custId; private String isAuto; private String cmsServiceFlag; private List<NhcmsPayDto> nhcmsPayDto; private List<AutoBillAddDto> autoBillAddDto; } 1000건이 한번에 commit 되는건가요? 5건씩 commit 되는 건가요? 아니면 다른 방법으로 해야되는지 문의합니다 만일 1000건이 한번에 commit된다면 500건 단위로 강제로 commit하거나 rollback 할수 있는 방법이 있을까요? 아 제가 jdbcTemplate로 for문으로 돌려서 사용하는데 혹시 건 단위로 commit 되는건가요? 제가 좀 헷갈려서요 ... 만일 건 단위로 한다면 500건씩 묶어서 할수 있는 방법이 있나요?
- 미해결스프링 배치
이런 내용을 다룬 부분이 강의에 있는지 궁금합니다.
안녕하세요. 실무에서 스프링 배치를 사용하고 있는데요. 차근차근 강의를 정주행하려고 구매 했었으나, 일정의 압박으로 필요한 부분만 발췌해서 듣고 있습니다. (그럼에도 많은 도움을 받았습니다. 감사합니다 :) 배치를 사용하며 궁금증이 생긴 부분이 있는데요. 예를 들어 Job A가 Step1, Step2로 구성되어 있고 각 Step의 Reader는 JdbcPagingItemReader를 사용한다고 했을 때, Step2의 특정 Chunk에서 Job이 실패한 뒤 재실행 하면 성공한 Step1 및 Step2의 Chunk들은 건너 뛰고 실패한 지점부터 재시작하게 되는데요. 이 과정이 어떻게 수행되는지 분석, 학습을 해보고 싶습니다. 혹시 해당 강의에 이 내용을 다룬 부분이 있을까요?
- 미해결스프링 배치
실무에서 이런 요건의 배치를 구성할 경우
안녕하세요 강사님.. 아래의 경우 spring batch 구성의 best practice 가 궁금합니다. - 배치 로딩 시간 > 스케줄 재실행 시간 - 외부 트리거(DB 데이터 insert 등) 에 의해 바로바로 배치가 실행되어야 하는 경우 감사합니다.
- 미해결스프링 배치
job launcher 캐스팅 문제 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요! simpleJobLauncher 캐스팅 관련해서 궁금한게 있습니다. SimpleJobLauncher simpleJobLauncher = (SimpleJobLauncher) basicBatchConfigurer.getJobLauncher(); 이렇게 캐스팅을 하는 이유는 jobLauncher에서 직접적으로 캐스팅을 할 수 없는 문제가 있어서 한다고 배웠습니다. 확인해보니 JobLauncher는 jdk dynamic proxy로 생성되어져있는데 cglib가 아닌 특별한 이유가 있을까요?
- 미해결스프링 배치
스프링 배치 트랜잭션 관련 질문이 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! job repository파트를 보고 궁금한 점이있어 문의드립니다. job repository는 배치 메타 테이블에 배치 내용을 crud하기위해서 사용되고 이 과정에서 serializable단계의 트랜잭션이 발생한다고 배웠습니다. 그렇다면 step의 비즈니스 로직은 이 트랜잭션 하위에서 execute되니... step의 비즈니스 로직의 트랜잭션 전파레벨을 따로 설정하지 않는다면 모두 트랜잭션으로 동작한다고 이해해야하는걸까요?? 또 이런 상황이라면 비즈니스 로직의 트랜잭션 격리 수준은 serializable을 따르게되는 건가요?!
- 미해결스프링 배치
@StepScope + JpaItemReader에서 EntityManager Null Pointer exception 발생 문제 도와주세요!
안녕하세요, 강사님. 항상 좋은 강의 제공해주셔서 감사합니다. 다름이 아니라 이번에 강사님 강의 보고 복습하던 도중에 문제가 발생해서 해결 방법이 있을까 해서 여쭤보려고 글을 작성했습니다. 파티셔닝 Step을 생성해서 처리하는 것을 따라해보고 있는데, 강사님께서는 ItemReader를 Jdbc 계열로 사용하셨는데, 저는 JPA를 선호해서 JPAItemReader를 사용했습니다. 먼저 단위 테스트를 위해 @StepScope 없이 JPAItemReader를 사용할 경우, 문제 없이 동작하는 것을 확인했습니다. 그런데 JpaItemReader에 @StepScope를 다는 순간 Null Pointer Exception이 발생하는 것을 확인했습니다. 처음에는 JpaItemReader가 Proxy Bean으로 주입이 안되는가? 라고 생각을 했었는데, 디버그 모드를 타고 가보니 다음과 같은 위치에서 문제가 있는 것을 확인했습니다. 프록시 객체에 타겟 객체는 정상적으로 주입을 해주는데, 문제는 타겟 객체인 JpaItemReader에 entityManager가 null이기 때문에 Reader를 하는 과정에서 문제가 있다는 것을 알게 되었습니다. EntityManager는 위에서 볼 수 있듯이 doOpen() step에서 제공해주는 것으로 보이는데, doOpen() Step을 거치지 않아 문제가 있는 것 같습니다. 조금 더 확인해보니 AbstractStep의 Open 메서드에 전달되는 ItemStream의 Size가 0인 것을 보니... 이것에 대해 문제가 있는 것 같습니다. 혹시 이처럼 JpaItemReader에서 @StepScope로 사용 시, EntityManager가 주입되지 않는 경우는 어떻게 해결해야 할까요? 아래는 제가 PartitionStep을 구성하기 전에 각각의 ItemReader, ItemWriter, ItemProcessor에서 @StepScope가 정상적으로 동작하는지 확인하기 위해 작성한 코드이고, 이 코드를 돌릴 때 문제가 발생하는 것을 확인했습니다. package io.springbatch.springbatchlecture.retry.partitioning;import io.springbatch.springbatchlecture.dbitemreader.Customer;import io.springbatch.springbatchlecture.dbwriter.Customer2;import lombok.RequiredArgsConstructor;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.core.configuration.annotation.StepScope;import org.springframework.batch.core.launch.support.RunIdIncrementer;import org.springframework.batch.core.partition.support.Partitioner;import org.springframework.batch.core.partition.support.SimplePartitioner;import org.springframework.batch.item.ItemProcessor;import org.springframework.batch.item.ItemReader;import org.springframework.batch.item.ItemWriter;import org.springframework.batch.item.database.JdbcPagingItemReader;import org.springframework.batch.item.database.Order;import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder;import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder;import org.springframework.batch.item.database.builder.JpaPagingItemReaderBuilder;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.task.SimpleAsyncTaskExecutor;import javax.persistence.EntityManagerFactory;import javax.sql.DataSource;import java.util.HashMap;import java.util.concurrent.atomic.AtomicLong;@Configuration@RequiredArgsConstructorpublic class SimpleTestConfig { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private final EntityManagerFactory emf; private final DataSource dataSource; private AtomicLong myId = new AtomicLong(); @Bean public Job batchJob200() { return jobBuilderFactory.get("partitioningJob") .incrementer(new RunIdIncrementer()) .start(slaveStep()) .build(); } @Bean public Step slaveStep() { return stepBuilderFactory.get("slaveStepMaster") .<Customer, Customer2>chunk(1000)// .reader(pagingItemReader()) .reader(batchReader()) .writer(batchWriter()) .processor(batchProcessor()) .build(); } @Bean @StepScope public ItemProcessor<? super Customer, ? extends Customer2> batchProcessor() { System.out.println("itemProcessor Here"); return (ItemProcessor<Customer, Customer2>) item -> Customer2.builder() .id(myId.incrementAndGet()) .birthDate(item.getBirthDate()) .firstName(item.getFirstName()) .lastName(item.getLastName()) .build(); } @Bean @StepScope public ItemWriter<? super Customer2> batchWriter() { return new JdbcBatchItemWriterBuilder<Customer2>() .sql("INSERT INTO Customer2(customer2_id, birth_date, first_name, last_name) values (:id, :birthDate, :firstName, :lastName)") .dataSource(dataSource) .beanMapped() .build(); } @Bean @StepScope public ItemReader<? extends Customer> batchReader() { return new JpaPagingItemReaderBuilder<Customer>() .name("partitionStepJpaReader") .currentItemCount(0) .entityManagerFactory(emf) .maxItemCount(1000) .queryString("select c from Customer c") .build(); } @Bean @StepScope // 앞쪽 강의 봐야함. public JdbcPagingItemReader<Customer> pagingItemReader() { System.out.println("Target Created"); HashMap<String, Order> sortKeys = new HashMap<>(); sortKeys.put("customer_id", Order.ASCENDING); return new JdbcPagingItemReaderBuilder<Customer>() .name("pagingBuilder") .dataSource(dataSource) .fetchSize(1000) .beanRowMapper(Customer.class) .selectClause("customer_id, first_name, last_name, birth_date") .fromClause("from customer")// .whereClause("where customer_id >= " + minValue + " and customer_id <= " + maxValue) .sortKeys(sortKeys) .build(); } @Bean public Partitioner partitioner() { SimplePartitioner simplePartitioner = new SimplePartitioner(); simplePartitioner.partition(4); return simplePartitioner; }}
- 미해결스프링 배치
RetryTemplate 질문 드립니다.
안녕하세요 이번 강의에서 RetryItemProcessor2 클래스에서 new DefaultRetryState(item, rollbackClassifier)를 추가하게 되면서 retry가 1번만 발생하게 되더라고요. Configuration에서 RetryPolicy로 maxAttempts를 2로 줬는데 왜 1번만 retry를 하는걸까요? 제가 디버깅하면서 보니까 처음 재시도때는 RetryPolicy가 Configuration에서 정의한 RetryPolicy가 적용됐는데, 2번째 재시도 하려고 할때 RetryPolicy가 SimpleRetryPolicy가 maxAttempts가 0인상태로, configuration에서 정의한 RetryPolicy가 아니더라고요. 왜 이렇게 된건지 알고싶습니다.
- 미해결스프링 배치
RunIdIdIncrementer가 잘 동작하지 않는 것 같습니다.
안녕하세요! 항상 좋은 강의 감사드립니다 이번에 강의 보면서 따라하고 있는데, RunIdIncremenet가 정상적으로 동작하지 않는 것 같아 문의 드리려고 글을 적었습니다 제가 이해하고 있기로는 RunIdIncrementer가 JobParameters를 항상 변화해서 공급해줘서 매번 JobInstance를 생성해 JobExecution을 실행할 수 있도록 도움을 주는 것으로 알고 있습니다. 지금까지 강의 들으면서 실제 복습하면서도 RunIdincremeneter는 정상적으로 작동했었구요. 그런데 이번에 Controller를 따서 Job을 실행하는 시점에는 runIdIncrementer()가 정상적으로 실행이 되지 않는 것 같습니다. 첫 자동 시작에서는 runIdIncremeneter()가 동작했으나, HTTP 요청하는 시점에서는 runIdIncremeneter()가 동작하지 않아 이미 존재하는 JobInstacne 예외 발생하며, DB에서도 runid가 생성되지 않습니다. 원래 RunIdIncremeneter는 http 요청에 대해서는 동작하지 않는 것일까요? 아래에 필요한 코드와 DB 값을 공유드립니다. db값을 보면 가장 오른쪽에 있는 68은 자동으로 실행된 잡이고, 다시 HTTP 요청을 했을 때 실행되는 잡이 69번입니다. 69번을 실행시켰을 때 예외가 발생되어 Body에 다른 값을 전달해서 실행을 시켰습니다. 이 때 보시면 run.id라는 값이 생성되지 않은 것이 확인이 됩니다. @Beanpublic Job jobOperationJob() { return jobBuilderFactory.get("jobOperationJob") .incrementer(new RunIdIncrementer()) .start(step1()) .next(step2()) .build();} @PostMapping("/batch/start")public String start(@RequestBody JobInfo jobInfo) throws NoSuchJobException, JobInstanceAlreadyExistsException, JobParametersInvalidException, InterruptedException { // jobName은 jobRegistry에서 구할 수 있음. Collection<String> jobNames = jobRegistry.getJobNames(); for (String jobName : jobNames) { SimpleJob job = (SimpleJob) jobRegistry.getJob(jobName); // SimpleJob으로 다운 캐스팅 System.out.println("jobName : " + jobName); jobOperator.start(job.getName(), "id=" + jobInfo.getId()); } return "batch is started";} '
- 미해결스프링 배치
jobExecution이 다시 실행되면 이전에 실행된 작업이 두 번 되지는 않습니까?
강의 내용의 시나리오에서 보면요 - JobInstanceB에서 - JobExcecution1은 실패 - StepExcecution1은 성공 - StepExcecution2는 실패 - JobExcecution2는 성공 - StepExcecution1은 성공 - StepExcecution2는 성공 이렇게 되었을 때요 StepExcecution1이 두 번 실행되면 작업이 중복수행되는 것은 아닌지 여쭙습니다!
- 미해결스프링 배치
JdbcPagingItemReader에서 ID값이 읽어지지 않습니다.
안녕하세요! 항상 좋은 강의 제공해주셔서 감사합니다. 강의를 바탕으로 실습을 하고 있는 도중 문제가 있어서 해당 부분을 문의 드리고자 글을 적습니다. 문제는 Jpa 기반 ItemReader를 사용할 경우, 객체에 정상적으로 PK값이 들어오는 것이 확인되는데, Jdbc 기반 ItemReader를 사용할 경우 PK값이 정상적으로 들어오지 않는 것이 확인됩니다. ItemReader에서 값을 읽어온 후, ItemProcessor에서 전달받은 Input Chunk를 item 단위로 로그를 찍었을 때 확인한 것이라, ItemReader를 통해 DB에서 읽은 값이 객체에 맵핑이 되지 않는 것 같습니다. 혹시 이런 경우, 제가 어떤 부분을 잘못 설정하고 있는 것인지 조언을 부탁 드릴 수 있을까요? 아래에 주요 코드 및 실행 결과를 첨부드립니다. @Entity 클래스 public class Customer { @Id @GeneratedValue @Column(name = "customer_id") private Long id; private String firstName; private String lastName; private LocalDate birthDate;} @JpaCursorItemReader @Beanpublic ItemReader<Customer> customerJpaItemReader() { HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("firstname", "%customer0"); return new JpaCursorItemReaderBuilder<Customer>() .name("jpaCursorItemReader") .entityManagerFactory(emf) .queryString("select c from Customer c") .maxItemCount(100) .currentItemCount(10) .build(); } @JpaCursorItemReader 실행 결과 pk값이 정상적으로 맵핑되서 올라옵니다. @JdbcPagingItemReader return new JdbcPagingItemReaderBuilder<Customer>() .name("JdbcPagingItemReaderJob") .dataSource(dataSource) .pageSize(10) .beanRowMapper(Customer.class) .fetchSize(CHUNK_SIZE) .currentItemCount(0) .maxItemCount(100) .selectClause("first_name, last_name, birth_date, customer_id") .fromClause("from Customer") .sortKeys(sortKey) .build();} @JdbcPagingItemReader 실행 결과 실행 결과 : Id값만 짤려서 올라옵니다.
- 미해결스프링 배치
샘플소스 문의 내용들이 종종 보여서...
어... 머랄 까 저희 익숙한 형태로 소스는 제공되지 않고 있는것 같습니다. 예를 들자면 chap1.zip 이런형태? 강사님이 git 으로 관리 하시고 단원? 챕터를 브런치로 관리 하시는 듯합니다. git 주소는 강의소개 탭 에 막~~ 스크롤 하면 강사소개 부분에 git 단어 클릭 하시면 강사님 git 으로 들어 가시면 됩니다. 거기에 spring-batch-lecture 라고 찿아 들어 가시면 됩는데 해당 레파지토리 들어 가시면 코드탭 누르면 왼쪽 상단 부분쪽에 master 라는 단어가 보입니다. 그 버튼을 클릭 하시면 Part2.1.x , Part1.1.1 이런식으로 브런치들이 보입니다. 이게 여러분들이 원하시는 단원별 소스 입니다. 하지만. Part.x.x 정확히 맞아 떨어지지는 않는것 같습니다. 그 근방에 소스는 맞는듯 하고 몇번 클릭 해서 원하는 소스 를 찿으시면 될것 같습니다. 저또한 샘플 소스 찿아 한참을 찿아 해메다가 저같은 분 계실까봐 남깁니다.
- 미해결스프링 배치
단원별 소스 다운로드 위치 문의
강사님 안녕하세요..좋은강의 감사드리며.. 단원별 소스 다운로드 위치 문의 드립니다. 감사합니다.
- 미해결스프링 배치
AsyncItemWriter 의 Transaction 범위 관련
안녕하세요 질문이 있어서 글을 남깁니다. 현재 저는 다중 데이터베이스 기반의 배치 Call 서버를 제작중에 있습니다. 한개의 데이터베이스는 Batch Metadata 저장 서버로, 다른 서버를 Datasource로 가져와서 ItemReader 나 Writer 로 사용하고 있습니다(2개의 datasource 지정) 다중서버 구성시 JpaItemWriter를 이용하게 되면, repository의 트랜잭션 보장 문제로 인하여 'no transaction in progress'문제가 생겼고, 해당 문제 확인 결과 stepBuilderFactory.transcationManager(PlatformTransactionManager)으로 다중 datasource에 writer를 처리할 수 있음을 알게 되었습니다. async방식의 처리에서 AsyncItemWriter도 같은 방식으로 transactionManager를 처리하였는데, 두가지의 문제가 발생하였습니다. 1) AsyncItemWriter에서 delegate시에 transactionManager 이 적용이 안되는지, 'no transaction is in progress' 가 발생합니다. 제가 주입하고자 하는 transactionManager가 적용이 안되고 delegate시 알아서 시스템이 자동 주입을 하는거 같은데, 해당 현상에 대한 해결방법을 알고싶습니다. * 해당 현상에 대한 에러는 하단에 남깁니다. ItemWriter 구현체는 JpaItemWriter입니다 2) 강사님의 강의에서도 나온 문제인데, StepBuilderFactory 반환에서 Warning이 발생하고 있습니다.(AsyncItemWriter 강의 21:50경) 타입을 체크하지 않고 발생하는 오류인데, 타입을 제대로 주면 Future때문인지 명확하게 warning이 해결되지 않고 있습니다. 이건 어노테이션으로 워닝 무시를 해야할 수 밖에 없는 것인지 알고 싶습니다. * 아마도 stepbuildFactory의 <input, output> 값이 <InputEntity, Future<OutputEntity>> 가 되어야 하는 것이 맞아보이는데 맞는지요? 에러) 22:51 INFO o.s.batch.core.job.SimpleStepHandler - Executing step: [asyncInitializationStep1] 22:51 ERROR o.s.batch.core.step.AbstractStep - Encountered an error executing step asyncInitializationStep1 in job initializationJob javax.persistence.TransactionRequiredException: no transaction is in progress at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:445) at org.hibernate.internal.SessionImpl.checkTransactionNeededForUpdateOperation(SessionImpl.java:3478) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1394) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1389) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362) at com.sun.proxy.$Proxy137.flush(Unknown Source) at org.springframework.batch.item.database.JpaItemWriter.write(JpaItemWriter.java:94) at org.springframework.batch.integration.async.AsyncItemWriter.write(AsyncItemWriter.java:85) at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:193) at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:159) at org.springframework.batch.core.step.item.SimpleChunkProcessor.write(SimpleChunkProcessor.java:294) at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:217) at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:77) at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:407) at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:331) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:273) at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82) at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375) at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145) at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:258) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:137) at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy148.execute(Unknown Source) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152) at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:413) at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:136) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:320) at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:149) at java.base/java.lang.Thread.run(Thread.java:829) 22:51 INFO o.s.batch.core.step.AbstractStep - Step: [asyncInitializationStep1] executed in 9s902ms 22:51 INFO o.s.b.c.l.support.SimpleJobLauncher - Job: [SimpleJob: [name=initializationJob]] completed with the following parameters: [{firmCode=0001, fileType=fixed, executeDate=1646661075421}] and the following status: [FAILED] in 9s960ms
- 미해결스프링 배치
Cursor 방식 ItemReader 관련 질문입니다.
안녕하세요. JdbcCursorItemReader 관련하여 질문하고 싶습니다. Cursor 기반 처리에서 모든 결과를 메모리에 할당하여 메모리 사용량이 많아진다는 단점이 있다고 하셨는데 여기서 '모든 결과' 를 메모리에 할당하는 부분이 fetchSize 크기 만큼 메모리에 올린다는 것을 말씀하시는 건지 궁굼합니다. 혹은 커서기반으로 처리했을 때 어떤 부분에서 메모리 사용량이 많아지는지 궁굼합니다.
- 미해결스프링 배치
Reader, Processor, Writer를 빈으로 등록 할 때와 그냥 클래스를 생성해서 등록할 때의 차이점이 궁금합니다.
강사님 안녕하세요. 좋은 강의 해주셔서 감사합니다. 38분 부분에서, CustomItemReader, CustomItemProcessor, CustomItemWriter를 클래스로 생성하시려다가 빈으로 등록하는 내용이 나오는데요. 배치 동작에 있어 두 방법 사이에 어떤 차이점이 있는지 알고 싶습니다. 감사합니다.
- 미해결스프링 배치
잡호출은 어떤식으로 하는지 궁금합니다.
안녕하세요. 강의듣는중에 궁금해서요 잡호출방식이 강의중 몇 강에 있는지요? 샘플은 spring boot를 실행하면 자동으로 잡들이 실행되는데, 실무에서는 스케줄이나 웹화면에서 실행을 하잖아요. 호출방식에 대한 가이드 부탁드려요. 감사합니다.
- 미해결스프링 배치
강의 코드와 git 코드
안녕하세요. 강사님 대부분의 강의 상 코드와 git에 있는 코드가 일치하지 않습니다. 일치시켜주실 수 없나요? 맞지 않아 불편합니다. 감사합니다.