远程过程调用失败且未执行怎么回事(远程过程调用失败且未执行u盘)
如果有更好的建议或者想看更多关于技术大全及相关资讯,可以多多关注茶馆百科网。

在日常开发过程中,我们经常需要调用第三方组件或数据库,有时一个查询可能会因为网络抖动或下游服务抖动而失败。
在这种情况下,我们通常会重试,并在多次重试后抛出一个异常以导致失败。接下来,范将向您展示这通常是如何完成的,以及如何更优雅地重试。
常规做法
我们来看一下一般做法,一般做法会先设置一个重试数,然后通过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)}}返回结果;一旦它正常启动,我们就可以通过浏览器访问它。
可以看到,我们在第一种方法中成功达到了预期的效果,随机数为0,第二次重试后结果正常。再进行几次尝试后,会遇到三个零,并抛出一个异常,表明服务确实有故障。
上面的代码可以看出是有效果的,虽然它不是很漂亮,特别是在一些其他逻辑的情况下,它会看起来很臃肿,但是它可以正常使用,所以一些伙伴会问,有没有优雅的方法?您不能在许多地方重复编写这样的重试代码。
要知道当我们普通人在日常发展的时候,如果我们遇到一个问题一定是别人遇到的,当我们遇到一个问题,没有人遇到过,那我们就很前卫了。
您所能想到的就是一种简单的重试方法。我们中的一些人已经想出了如何通过使用@Retryable注释来实现相同的效果。Fan将展示如何使用extends Throwable[] value()默认值;课吗?extends Throwable[] include() default;课吗?extends Throwable[] exclude() default;字符串标签()默认";布尔状态()默认false;int maxAttempts()默认为3;字符串maxattemptexpression()默认";Backoff()默认@Backoff;String exceptionExpression() default ";String[] listeners() default;}在注释中,我们可以看到注释的代码如下所示,我们将解释几个参数
Recover:当前类中回滚方法的名称;Interceptor:重试拦截器的名称。您可以在重试时配置拦截器。取值:指定要重试的异常类型。该值与下面的include相同。include:包含的重试异常类型;Exclude:排除的重试异常类型。label:用于统计的唯一标识符;stateful: statefu标志表示重试是否有状态,即如果异常被重新抛出,是否将该重试策略应用于具有相同参数和相同策略的后续调用。如果为false,则不会重新抛出重试异常。maxAttempts:重试次数。backoff:指定用于重试此操作的属性;listener:重试侦听器bean名称;利用上面的一些属性,我们可以实现简单的标注,实现方法调用后的自动重试,非常有用。我们可以在执行重试方法时设置自定义重试拦截器,如下所示。自定义重试拦截器需要实现MethodInterceptor接口和invoke方法,但请注意,如果使用拦截器,方法上的参数将被覆盖。
包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;@Componentpublic类CustomRetryInterceptor实现MethodInterceptor}自定义回滚方法。如果几次尝试后仍然出现错误,还可以编写自定义回滚方法。
@Retryable(value=Exception.class, recover='recover', maxAttempts=2, backoff=@Backoff(delay=1000, multiplier=2)) public String sayHello(String name) @Recover public String recover(Exception e, String name)
重试方法必须使用@Recover注释;返回值必须与正在重试的函数的返回值相同。除了第一个参数是被触发的异常之外,下一个参数应该与重试函数的参数列表相同。上面代码中的@Backoff(delay=1000, multiplier=2)表示第一次重试延迟1000ms,随后每次重试的延迟加倍。
今天,范介绍了Spring的@Retryable注释的使用,并通过几个演示编写了我们自己的重试拦截器和回滚方法。使用它们有趣吗?现在让我们使用它们,因为有很多细节。只有真正使用它,你才能欣赏它。
本文主要介绍了关于远程过程调用失败且未执行怎么回事(远程过程调用失败且未执行u盘)的相关养殖或种植技术,栏目还介绍了该行业生产经营方式及经营管理,关注发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解技术怎么管理的要点,是您致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/1608844.html