8

Tôi đang đọc lên trên GCM: https://developers.google.com/cloud-messaging/serverXuân RestTemplate: Exponential Backoff thử lại chính sách

và một trong những yêu cầu là máy chủ cần phải có khả năng:

  • xử lý các yêu cầu và gửi lại chúng bằng cách sử trả về theo hàm số mũ.

Tôi sử dụng Spring RestTemplate cho phần phụ trợ của tôi xuất phát từ Spring Boot. Có vẻ như không phải là phương pháp mà tôi có thể sử dụng để đặt chính sách thử lại của tôi trong tài liệu: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

Ngoài ra khi tôi googled, tôi tìm thấy RetryTemplate, nhưng nó là một phần của Spring Batch và không mở rộng RestTemplate điều này khiến tôi nghĩ rằng nó không được sử dụng cho các hoạt động Rest, mà là các hoạt động của Spring Batch như xử lý số lượng lớn các giao dịch: http://docs.spring.io/spring-batch/2.1.x/apidocs/org/springframework/batch/retry/support/RetryTemplate.html

Có cách nào tôi có thể sử dụng backoff mũ với Spring RestTemplate?

+3

https://github.com/rholder/guava-retrying có chiến lược thử lại theo hàm mũ. Đó là một chiếc máy sấy đa năng, bạn có thể sử dụng để thử lại bất cứ thứ gì bạn muốn. –

+1

Bạn có thể thêm tính năng thử lại mùa xuân làm phụ thuộc để xử lý Thử lại https://github.com/spring-projects/spring-retry. –

+1

Chúng tôi đã thực hiện như vậy trong khung cốt lõi để hỗ trợ JMS. Đây là một ý tưởng thú vị. Bạn có thể vui lòng tạo ra một vấn đề [trong bộ theo dõi vấn đề khung Spring] (https://jira.spring.io/browse/SPR)? Cảm ơn! –

Trả lời

5

Chúc ngày vui vẻ!

Tôi đoán, hành vi mong muốn có thể đạt được bằng cách triển khai lớp tùy chỉnh Sleeper.

Tiếp theo, bạn cần phải thiết lập ngủ này để BackOffPolicy như sau:

public class RetryTest { 

    public static final Logger LOG = LoggerFactory.getLogger(RetryTemplate.class); 

    @org.junit.Test 
    public void testRT() { 
    RetryTemplate retryTemplate = new RetryTemplate(); 
    final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
    retryPolicy.setMaxAttempts(5); 
    retryTemplate.setRetryPolicy(retryPolicy); 

    Sleeper sleeper = new Sleeper() { 
     private long timeToSleep = 0; 
     @Override 
     public void sleep(long timeout) throws InterruptedException { 
     if (timeToSleep ==0) { 
      timeToSleep = timeout; 
     } else { 
      timeToSleep = (long) (timeToSleep * Math.E); 
     } 
     LOG.warn("sleeping for: {}", timeToSleep); 
     Thread.sleep(timeToSleep); 
     } 
    }; 
    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy().withSleeper(sleeper); 
    retryTemplate.setBackOffPolicy(backOffPolicy); 
    retryTemplate.execute(new RetryCallback<Void, ResourceAccessException>() { 
     @Override 
     public Void doWithRetry(RetryContext retryContext) throws ResourceAccessException { 
     LOG.debug(">RetryCount: {}", retryContext.getRetryCount()); 
     new RestTemplate().getForObject("https://unreachable.host", String.class); 
     return null; 
     } 
    }); 
    } 
} 

Cũng có ExponentialBackOffPolicy vào mùa xuân-retry.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan