Search code examples
javaspringrecoverspring-retry

Spring Retry @Recover passing parameters


I couldn't find any info about a possibility of action I need. I am using @Retryable annotation with @Recover handler method. Smth like this:

    @Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 10000))
    public void update(Integer id)
    {
        execute(id);
    }

    @Recover
    public void recover(Exception ex)
    {
        logger.error("Error when updating object with id {}", id);
    }

The problem is that I don't know, how to pass my parameter "id" to recover() method. Any ideas? Thanks in advance.


Solution

  • According to the Spring Retry documentation, just align the parameters between the @Retryable and the @Recover methods :

    The arguments for the recovery method can optionally include the exception that was thrown, and also optionally the arguments passed to the orginal retryable method (or a partial list of them as long as none are omitted). Example:

    @Service
    class Service {
        @Retryable(RemoteAccessException.class)
        public void service(String str1, String str2) {
            // ... do something
        }
        @Recover
        public void recover(RemoteAccessException e, String str1, String str2) {
           // ... error handling making use of original args if required
        }
    }
    

    So you could write :

    @Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 10000))
    public void update(Integer id) {
        execute(id);
    }
    
    @Recover
    public void recover(Exception ex, Integer id){
        logger.error("Error when updating object with id {}", id);
    }