Last updated
Last updated
이 절에서는 의 동시 잠금 실패 재시도 예제가 스키마 지원으로 다시 작성 될 때 어떻게 표시되는지 보여줍니다.
비즈니스 서비스의 실행은 동시성 문제 (예 : 교착 상태 실패자)로 인해 때때로 실패 할 수 있습니다. 작업이 다시 시도되면 다음 시도에서 성공할 수 있습니다. 그러한 조건 (충돌 해결을 위해 사용자에게 다시 돌아갈 필요가없는 멱등 원 (itempotent) 작업)에서 다시 시도하는 것이 적합한 비즈니스 서비스의 경우 클라이언트가 PessimisticLockingFailureException
을 보지 않도록 작업을 투명하게 다시 시도해야 합니다. 이는 서비스 계층의 여러 서비스를 명확히 차단하는 요구 사항이므로 aspect 통한 구현에 이상적입니다.
proceed
를 여러 번 호출 할 수 있도록 around advice을 사용해야합니다. 다음 목록은 기본 aspect 구현 (스키마 지원을 사용하는 일반적인 Java 클래스)을 보여줍니다.
aspect는 Ordered
인터페이스를 구현하여 aspect의 우선 순위를 트랜잭션 advice 보다 높게 설정할 수 있습니다 (우리는 재 시도 할 때마다 새로운 트랜잭션을 원합니다). maxRetries
및 order
속성은 모두 스프링에 의해 구성됩니다. 주요 동작은 doConcurrentOperation
around advice 메소드에서 발생합니다. 우리는 계속 하려고합니다. PessimisticLockingFailureException
으로 실패하면 재 시도를 모두 마쳤으면 다시 시도합니다.
해당 스프링 설정은 다음과 같습니다.
당분간은 모든 비즈니스 서비스가 멱등수라고 가정합니다. 그렇지 않은 경우 다음 예처럼 Idempotent
주석을 도입하고 주석을 사용하여 서비스 작업 구현에 주석을 추가하여 진정으로 멱등 원 작업만 재 시도하도록 aspect를 조정할 수 있습니다.
aspect에 대한 멱등 원 작업만을 재 시도하는 것은 다음과 같이 @Idempotent
연산 만 일치하도록 pointcut 표현식을 수정하는 작업을 포함합니다.
이 클래스는 @AspectJ 예제에서 사용 된 것과 동일하지만 Annotation이 제거 된 클래스입니다.