2013-10-02 2 views
0

우리는 Spring 배치를 사용하는 배치 작업에서 ItemProcessListener와 SkipListener를 구현했습니다. 별도의 트랜잭션을 생성하지 않고 건너 뛴 항목을 데이터베이스에 기록 할 수 있습니다. 그러나 ItemProcessListener에서 onProcessError 메소드가 호출 될 때 트랜잭션은 해당 런타임 예외로 인해 롤백됩니다.ItemProcessListener 내의 DB에 오류 레코드를 기록 할 수 없습니다 - onProcessError

DB 업데이트 용 서비스 인터페이스에서 @Transactional 및 propagation을 REQUIRES_NEW로 사용했지만 여전히 트랜잭션을 롤백했습니다.

우리의 목표는 프로세스 또는 기록기 구성 요소에 오류가 있고 배치가 실패 할 때마다 데이터베이스에 예외 세부 사항을 기록하는 것입니다. 위에서 설명한 것처럼 onProcessError 메서드에서 DB 삽입 또는 재정의 된 수신기에서 onWriteError 메서드를 실행하면 로깅이 작동하지 않습니다. 트랜잭션이 롤백됩니다.

onProcessError에서 주석을 사용하여 새 트랜잭션을 만들려고했으나 실패했습니다. 친절하게도 동일한 정보를 입력하십시오.

이렇게하면 문제가 명확 해집니다.

답변

1

스프링 구성을 사용하려면 특수 효과를 사용하도록 설정해야합니다. applicationContext.xml의 tx 스키마를 사용하여 주석을 활성화 할 수 있습니다.

봄 설명서에 따라 http://docs.spring.io/spring/docs/2.5.6/reference/transaction.html#transaction-declarative-annotation. 우리는

의 xmlns를 다음 네임 스페이스를 포함해야합니다 : 텍사스 = "http://www.springframework.org/schema/tx"는 itemProcessorListener의 onProcessError 방법이 실행
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd

때문에 처리중인 청크와 동일한 트랜잭션에서 메소드가 롤백 전에 호출됩니다. @Transactional (propagation = Propagation.REQUIRES_NEW)을 사용하여 트랜잭션을 처리하면 새 트랜잭션이 작성되고 데이터가 데이터베이스에 지속됩니다.

관련 문제