Một vài ngày trước, tôi nhận thấy rằng có một nhóm người hỏi cách sử dụng Thử lại mùa xuân . Trước khi tôi đi vào mã mẫu, hãy để tôi giải thích nhanh mục đích đằng sau Thử lại mùa xuân . Spring Retry cung cấp khả năng tự động gọi lại một hoạt động bị lỗi. Điều này rất hữu ích khi các lỗi có thể chỉ là thoáng qua (như sự cố mạng tạm thời). Spring Retry cung cấp một kiểm soát khai báo của quá trình và hành vi dựa trên dễ dàng mở rộng và tùy chỉnh.

Maven phụ thuộc

  <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies> 

Bật Thử lại

  package com.chrisshayan.example.springretry;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;

@EnableRetry
@SpringBootApplication
public class SpringRetryApplication {

public static void main(String[] args) {
SpringApplication.run(SpringRetryApplication.class, args);
}

} 

Sử dụng Thử lại với Chú thích

  package com.chrisshayan.example.springretry;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
public class SampleRetryService {
    private static final Logger LOGGER = LoggerFactory.getLogger(SampleRetryService.class);

    private static int COUNTER = 0;

    @Retryable(
            value = {TypeOneException.class, TypeTwoException.class},
            maxAttempts = 4, backoff = @Backoff(2000))
    public String retryWhenException() throws TypeOneException, TypeTwoException {
        COUNTER++;
        LOGGER.info("COUNTER = " + COUNTER);

        if(COUNTER == 1)
            throw new TypeOneException();
        else if(COUNTER == 2)
            throw new TypeTwoException();
        else
            throw new RuntimeException();
    }

    @Recover
    public String recover(Throwable t) {
        LOGGER.info("SampleRetryService.recover");
        return "Error Class :: " + t.getClass().getName();
    }
} 

Để lớp thử nghiệm của bạn hoạt động, việc thử lại cần phải ở trong ngữ cảnh thích hợp. Điều này là do chúng ta cần có một dịch vụ khác kết thúc quá trình thử lại. Điều này được gọi là:

  package com.chrisshayan.example.springretry;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SampleRetryClientService {

    @Autowired
    private SampleRetryService sampleRetryService;


    public String callRetryService() throws TypeOneException, TypeTwoException {
        return sampleRetryService.retryWhenException();
    }
} 

Lớp kiểm tra

  package com.chrisshayan.example.springretry;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SpringRetryApplicationTests {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpringRetryApplicationTests.class);
    @Autowired
    private SampleRetryClientService client;

@Test
public void contextLoads() {
}

@Test
    public void sampleRetryService() {
        try {
            final String message = client.callRetryService();
            LOGGER.info("message = " + message);
        } catch (TypeOneException | TypeTwoException e) {
            e.printStackTrace();
        }
    }

} 

Bảng điều khiển

  2018-07-10 23:42:45.528  INFO 14583 --- [           main] c.c.e.springretry.SampleRetryService     : COUNTER = 1
2018-07-10 23:42:47.534  INFO 14583 --- [           main] c.c.e.springretry.SampleRetryService     : COUNTER = 2
2018-07-10 23:42:49.538  INFO 14583 --- [           main] c.c.e.springretry.SampleRetryService     : COUNTER = 3
2018-07-10 23:42:49.539  INFO 14583 --- [           main] c.c.e.springretry.SampleRetryService     : SampleRetryService.recover
2018-07-10 23:42:49.539  INFO 14583 --- [           main] c.c.e.s.SpringRetryApplicationTests      : message = Error Class :: java.lang.RuntimeException 

Có nhiều khả năng hơn trong Spring Retry, chẳng hạn như Stateless Retry, Stateful Retry, các chính sách thử lại và trình nghe khác nhau. Bạn có thể đọc thêm ở đây.
Hy vọng bạn thích bài viết này và có thể biết thêm Cách sử dụng Spring Retry với một vài bước đơn giản. Nếu tôi bỏ lỡ điều gì đó, hãy chia sẻ quan điểm của bạn trong phần bình luận bên dưới. Đăng ký cho signalfix.net bản tin cho một số thủ thuật và mẹo hay.