Spring异常重试框架Spring Retry详解编程语言

Spring Retry支持集成到Spring或者Spring Boot项目中,而它支持AOP的切面注入写法,所以在引入时必须引入aspectjweaver.jar包。

快速集成的代码样例:

复制代码
@Configuration 
@EnableRetry 
public class Application { 
 
    @Bean 
    public Service service() { 
        return new Service(); 
    } 
 
} 
 
@Service 
class Service { 
    @Retryable(RemoteAccessException.class) 
    public service() { 
        // ... do something 
    } 
}
复制代码

下面是基于Spring Boot项目的集成步骤:

POM:

复制代码
        <!-- Spring Retry --> 
        <dependency> 
            <groupId>org.springframework.retry</groupId> 
            <artifactId>spring-retry</artifactId> 
        </dependency> 
        <dependency> 
            <groupId>org.aspectj</groupId> 
            <artifactId>aspectjweaver</artifactId> 
        </dependency>
复制代码

Service:

复制代码
package com.jsoft.springboottest.springboottest1; 
 
import java.time.LocalTime; 
 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
 
import org.springframework.remoting.RemoteAccessException; 
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 RemoteService { 
     
    private final static Logger logger = LoggerFactory.getLogger(RemoteService.class); 
     
    @Retryable(value = { RemoteAccessException.class }, maxAttempts = 3, backoff = @Backoff(delay = 5000l, multiplier = 1)) 
    public void call() throws Exception { 
        logger.info(LocalTime.now()+" do something..."); 
        throw new RemoteAccessException("RPC调用异常"); 
    } 
 
    @Recover 
    public void recover(RemoteAccessException e) { 
        logger.info(e.getMessage()); 
    } 
}
复制代码

@Retryable注解

被注解的方法发生异常时会重试 

  • value:指定发生的异常进行重试 
  • include:和value一样,默认空,当exclude也为空时,所有异常都重试 
  • exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试 
  • maxAttemps:重试次数,默认3 
  • backoff:重试补偿机制,默认没有

@Backoff注解

  • delay:指定延迟后重试 
  • multiplier:指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒

@Recover 

当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调。

Controller:

复制代码
package com.jsoft.springboottest.springboottest1.controller; 
 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 
 
import com.jsoft.springboottest.springboottest1.RemoteService; 
 
@RestController 
public class TestController { 
     
    @Autowired 
    private RemoteService remoteService; 
     
    @RequestMapping("/show") 
    public String show(){ 
        try { 
            remoteService.call(); 
        } catch (Exception e) { 
            // TODO Auto-generated catch block 
            //e.printStackTrace(); 
        } 
        return "Hello World";         
    } 
}
复制代码

App:

复制代码
package com.jsoft.springboottest.springboottest1; 
 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.retry.annotation.EnableRetry; 
 
/** 
 * Hello world! 
 * 
 */ 
@SpringBootApplication 
@EnableRetry 
public class App  
{ 
    public static void main( String[] args ) 
    { 
        SpringApplication.run(App.class, args); 
    } 
}
复制代码

效果:

Spring异常重试框架Spring Retry详解编程语言

说明:

[email protected][email protected][email protected]@Bean去实例才能生效。

[email protected][email protected],只能是void才能生效。

[email protected]..catch包裹,要在发放上抛出异常,不然不会触发。

4、在重试期间这个方法是同步的,如果使用类似Spring Cloud这种框架的熔断机制时,可以结合重试机制来重试后返回结果。

5、Spring Retry不只能注入方式去实现,还可以通过API的方式实现,类似熔断处理的机制就基于API方式实现会比较宽松。

 

示例代码:https://github.com/easonjim/5_java_example/tree/master/springboottest/springboottest3 

 

参考:

http://blog.csdn.net/u014513883/article/details/52371198(以上内容部分转自此篇文章)

https://github.com/spring-projects/spring-retry(官网)

http://www.jianshu.com/p/314059943f1c

http://www.broadview.com.cn/article/233(熔断重试)

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/15689.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论