분산 시스템에서 데이터 분산 트랜잭션의 일관성을 높이기 위해 RPC 인터페이스를 호출하거나 MQ를 보낼 때 네트워크 지터 요청 타임 아웃을 방지하기 위해 재 시도 작업을 수행합니다. 재 시도하는 가장 일반적인 방법은 MQ이지만 프로젝트에 MQ를 소개하지 않으면 불편합니다. 이 기사는 주로 스프링 레트리를 사용하여 재 시도 작업을 구현하는 방법을 소개합니다.
1. Maven 의존성을 추가하십시오
<pectionency> <groupId> org.springframework.retry </groupid> <artifactid> 스프링-레 트리 </artifactid> <버전> 1.1.2. 2. release </version> </dependency> <groupId> org.aspectj </groupid> <artifactid> arspectjweaver </exceent> 1.4 </version> </version> 1.4 </version> 1.
2. 시작시 재 시도 구성을 추가하십시오
@SpringBootApplication @Enabreretry Public Class Application {public static void main (String [] args) {springApplication.run (application.class, args); }} 3. 서비스를 작성하십시오
@Service Public Class RemotesErvice {private static final logger = loggerfactory.getLogger (testController.class); @retryable (value = {businessexception.class}, maxAttempts = 3, backoff = @backoff (Delay = 5000L, multiplier = 2)) public void call ()는 예외 {logger.info ( "do something ..."); 새로운 BusinessException ( "rpc 호출 예외")을 던지십시오. } @Recover public void recover(BusinessException e) { logger.info(" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4. 컨트롤러를 쓰십시오
@RestController @RequestMapping ( "/test") 공개 클래스 TestController {private static final logger = loggerfactory.getLogger (testController.class); @autowired Private Remoteservice Remoteservice; @requestmapping ( "/test") public String login ()은 예외 {remoteservice.call (); return string.valueof ( "11"); } 5. http : // localhost : 8080/test/test를 방문하십시오
6. 테스트 로그
201즈
201즈
201즈
2017-07-25 19:28:22 [info]-[HTTP-NIO-53602-Exec-1]-[com.test.retry.service.remoteservice.recover (remoteservice.java:24)] ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2017-07-25 19:28:22 [info]-[HTTP-NIO-53602-Exec-1]-[com.test.retry.service.remoteservice.recover (remoteservice.java:25)] rpc 호출 예외
7. 관련 구성 지침
@enabreretry 다시 시도해 볼 수 있습니까 ? proxytargetClass 속성이 참이면 cglib 프록시를 사용하십시오. 표준 Java 주석은 기본적으로 사용됩니다. Spring Boot 에서이 매개 변수는 프로그램 입구에 작성할 수 있습니다.
@retryable이 주석을 표시하는 방법은 예외가 발생할 때 재 시도됩니다.
값 : 처리 할 예외 클래스를 지정하십시오
포함 : 처리 된 지정된 예외 클래스는 값과 동일하며 기본값은 비어 있습니다. 제외가 비어있을 때, 모든 예외는 모두 기본적으로 기본적으로
제외 : 예외가 처리되지 않음을 지정하고, 기본값이 비어 있고, 포함 된 경우도 비어 있으면 기본값 모든 예외
MaxAttempts : 최대 회수 수. 기본값 3 번
백 오프 : 대기 정책을 다시 시도하십시오. 기본적으로 @backoff 주석을 사용하십시오
@backoff Retry 대기 정책 <br /> 매개 변수가 설정되지 않으면 기본적으로 FixedBackoffPolicy가 사용되며 (대기 시간을 지정), Retry는 1000ms를 기다립니다.
지연을 설정하고, 고정소 오프 포비를 사용하고 (대기 시간을 지정) 대기 시간을 다시 채울 수 있습니다.
지연 및 최대를 설정할 때 다시 시도 하고이 두 값 사이의 균질 한 분포를 기다립니다.
지연, 최대 및 승수 설정 지수를 사용하여 지수 백 오프 포비를 사용합니다 (지수 재 시도 간격 구현), 승수는 지연 = 5000L, 승수 = 2와 같은 지연 다중 지연을 지정합니다. 첫 번째 재 시도는 5 초, 두 번째 시간은 10 초이며 세 번째 시간은 20 초입니다 ...
@recover는 @ritryable의 실패한 재 시도 방법에 사용됩니다. 이 주석의 메소드 매개 변수는 @retryable에 의해 발생하는 예외 여야합니다. 그렇지 않으면 인식되지 않습니다. 이 방법에서 로그 처리를 수행 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.