1. 首页
  2. 综合百科
  3. 远程过程调用失败且未执行怎么办(远程协助无法使用解决方法)

远程过程调用失败且未执行怎么办(远程协助无法使用解决方法)

简介:关于远程过程调用失败且未执行怎么办(远程协助无法使用解决方法)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

在日常开发过程中,我们经常需要调用第三方组件或数据库,有时由于网络抖动或下游业务抖动导致查询失败。

在这种情况下,我们通常会重试,并且只有在多次重试后才会抛出异常以失败。接下来,Fan将向您展示这通常是如何完成的,以及如何更优雅地重试。

常规做法

我们来看看一般的做法,一般的做法会先设置一个重试次数,然后通过while循环,当循环次数没有达到重试次数时,直到返回正确的结果,如果重试仍然失败,它会休眠一段时间,然后再次重试。返回,直到达到正常返回或重试次数为止。

包com.example.demo.service;进口org.springframework.retry.annotation.Backoff;进口org.springframework.retry.annotation.Retryable;进口org.springframework.stereotype.Service;进口java.util.Random;进口java.util.concurrent.TimeUnit;@Servicepublic类HelloService catch (Exception e) catch (InterruptedException ex)}}返回结果;这里,为了模拟异常情况,Fan在doSomething函数中进行随机数生成和使用,当随机值为0时,将触发Java。朗。ArithmeticException异常,因为零除数不能做到。

接下来,我们提供一个用于访问的外部接口,如下面的代码所示

包com.example.demo.controller;进口com.example.demo.service.HelloService;进口org.springframework.beans.factory.annotation.Autowired;进口org.springframework.web.bind.annotation.GetMapping;进口org.springframework.web.bind.annotation.RequestParam;进口org.springframework.web.bind.annotation.RestController;在@RestControllerpublic类HelloController}正常启动后,我们通过浏览器访问它。

可以看到,我们在第一种方法中成功地达到了预期的效果,随机数为0,在第二次重试后结果正常。再尝试几次之后,遇到三个0,抛出一个异常,表明服务确实有故障。

上面的代码可以看出是有效果的,虽然不是很美观,尤其是在一些其他逻辑的情况下,会显得很臃肿,但是可以正常使用,所以有的小伙伴会问,有没有优雅的方式呢?您不能在许多地方重复编写这样的重试代码。

我们要知道,当我们普通人在日常发展的时候,如果我们遇到问题一定是别人遇到的,当我们遇到问题的时候,没有人遇到过,说明我们是很前卫的。

我所有的朋友都能想到一个简单的重试方法。有些人通过@Retryable注释帮助我们实现了同样的效果。接下来,Fan将演示如何使用这个注释。

我们需要做的第一件事是向启动类添加@EnableRetry注释来启用重试,这是有意义的,就像我们添加@ enablesscheduleing注释来启用计时一样。

添加注释之后,需要添加节的依赖项,如下所示

依赖项groupIdorg aspectj/groupId artifactIdaspectjweaver/artifactId version1.9.2/version/dependency不加入此方面,启动时出现以下异常

在添加注释和依赖项之后,我们需要重新构造HelloService中的sayHello()方法,通过添加@Retryable注释并设置相应的参数值来简化下面的操作。

@Retryable(value=Exception.class, maxAttempts=3, backoff=@Backoff(delay=1000, Multiplier=2) public String sayHello(字符串名)通过浏览器访问http://127.0.0.1:8080/hello?我们看到的效果如下,就像我们自己编写的重试一样。

注解重试

////由IntelliJ IDEA从.class文件重新创建的源代码//(由FernFlower反编译器提供动力)//package org.springframework. try.annotation;进口java.lang.annotation.Documented;进口java.lang.annotation.ElementType;进口java.lang.annotation.Retention;进口java.lang.annotation.RetentionPolicy;进口java.lang.annotation.Target;@Target()@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Retryable;课吗?extends Throwable[] include() default:课吗?extends Throwable[] exclude() default:字符串标签()默认“;Boolean stateful()默认false;int maxAttempts() default 3;String maxAttemptsExpression() default ";Backoff()默认@Backoff;default ";String[]监听器()默认;}在注释中,我们可以看到注释的代码如下所示,其中包含我们将解释的几个参数

Recover:当前类中回滚方法的名称;“Interceptor”:重试拦截器名称。重试时可以配置拦截器。Value:重试的异常类型。取值同如下include。include:包含重试异常类型;Exclude:排除重试异常类型。标签:用于统计的唯一标识符;stateful: statefu表示重试是否有状态,即如果重新抛出异常,该重试策略是否应用于具有相同参数和相同策略的后续调用。如果为false,则不会重新抛出重试的异常。maxAttempts:重试次数。backoff:指定用于重试此操作的属性;监听器:重试监听器bean名称;利用上面的一些属性,我们可以实现简单的注释,实现方法调用后的自动重试,非常有用。我们可以在执行重试方法时设置自定义重试拦截器,如下所示。自定义重试拦截器需要实现MethodInterceptor接口并实现调用方法,但请注意,如果使用了拦截器,方法上的参数将被覆盖。

包com.example.demo.pid;进口org.aopalliance.intercept.MethodInterceptor;进口org.aopalliance.intercept.MethodInvocation;进口org.springframework.retry.interceptor.RetryInterceptorBuilder;进口org.springframework.retry.interceptor.RetryOperationsInterceptor;进口org.springframework.retry.policy.SimpleRetryPolicy;进口org.springframework.stereotype.Component;自定义回滚方法。如果尝试几次后仍然出现错误,还可以编写自定义回滚方法。

@Retryable(value=Exception.class, recover='recover', maxAttempts=2, backoff=@Backoff(delay=1000, multiplier=2)) public String sayHello(字符串名)@Recover public String恢复(Exception e,字符串名)

重试方法必须使用@Recover注释;返回值必须与正在重试的函数的返回值相同。除了第一个参数是被触发的异常之外,下一个参数应该与重试函数的参数列表相同。上面代码中的@Backoff(delay=1000, multiplier=2)表示第一次重试延迟1000ms,后续每次重试的延迟加倍。

今天,我介绍了Spring的@Retryable注释的使用,并介绍了几个演示来指导您编写自己的重试拦截器和回滚方法。使用它们有趣吗?请现在使用,有很多细节。只有你真正使用它,你才能欣赏它。

本文主要介绍了关于远程过程调用失败且未执行怎么办(远程协助无法使用解决方法)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/1450947.html