首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java实现几种简单的重试机制

背景 当业务执行失败之后,进行重试是一个非常常见的场景,那么如何在业务代码中优雅的实现重试机制呢?...设计 我们的目标是实现一个优雅的重试机制,那么先来看下怎么样才算是优雅 无侵入:这个好理解,不改动当前的业务逻辑,对于需要重试的地方,可以很简单的实现 可配置:包括重试次数,重试的间隔时间,是否使用异步方式等...,然后在切面中实现重试的逻辑,主要的配置参数则根据注解中的选项来初始化 优点: 真正的无侵入 缺点: 某些方法无法被切面拦截的场景无法覆盖(如spring-aop无法切私有方法,final方法) 直接使用...,简单的实现下就好了,也没有必用用到上面这么重的方式;而且我希望可以针对代码快进行重试 这个的设计还是非常简单的,基本上代码都可以直接贴出来,一目了然: public abstract class RetryTemplate...消息方式 依然是在EventBus的基础上进行开发,结果写到一半,发现这种方式局限性还蛮大,基本上不太适合实际使用,下面依然给出实现逻辑 定义的重试事件RetryEvent @Data public class

19.5K114

HttpComponents HttpClient连接池(7)-重试

在上一篇文章里我们介绍了 httpclient 连接池中空闲连接的清理,在这里我们主要介绍 http 连接重试机制。...http连接重试 httpclient 连接池也支持请求的重试,即在请求失败的情况下进行重试,对于重试设计以下几个关键点。...如何开启重试 如何定义重试次数 如何进行重试 如何开启重试 在 httpclient 连接池中,连接发送请求的重试是由 HttpRequestRetryHandler 类型的对象来处理,在HttpClientBuilder...对于请求 abort 的定义, 是指调了以前文章介绍的 ManagedHttpClientConnection 类型对象的shutdown 方法,绕过 TCP4 次握手关闭 socket 连接,直接设置...目前先写到这里,在下一篇文章里我们开始介绍 httpclient 连接池对于 ssl 支持。

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

Spring-Retry重试实现原理

作者 | Alben 来源 | http://r6d.cn/LJJN 概要 Spring实现了一套重试机制,功能简单实用。...本文将讲述如何使用Spring Retry及其实现原理。 背景 重试,其实我们其实很多时候都需要的,为了保证容错性,可用性,一致性等。...重试策略 看一下Spring Retry自带的一些重试策略,主要是用来判断当方法调用异常时是否需要重试。(下文原理部分会深入分析实现) ?...,即它是如何使得你的代码实现重试功能的;二是重试机制的详细,包括重试的逻辑以及重试策略和退避策略的实现。...这样就相当于对重试的上下文做了优化。 总结 Spring Retry通过AOP机制来实现对业务代码的重试”入侵“,RetryTemplate中包含了核心的重试逻辑,还提供了丰富的重试策略和退避策略。

1.6K10

RabbitMQ实现延时重试队列

本文将会讲解如何使用RabbitMQ实现延时重试和失败消息队列,实现可靠的消息消费,消费失败后,自动延时将消息重新投递,当达到一定的重试次数后,将消息投递到失败消息队列,等待人工介入处理。...在这里我会带领大家一步一步的实现一个带有失败重试功能的发布订阅组件,使用该组件后可以非常简单的实现消息的发布订阅,在进行业务开发的时候,业务开发人员可以将主要精力放在业务逻辑实现上,而不需要花费时间去理解...Show me the code 我分别用Java和PHP实现了本文所讲述的方案,读者可以通过参考代码以及本文中的基本步骤来更好的理解 rabbitmq-pubsub-php rabbitmq-pubsub-java...,连接断开后自动删除 no-wait false 该方法需要应答确认 auto-delete false 当不再使用时,是否自动删除 对于@retry重试队列,需要指定额外参数 'x-dead-letter-exchange...、失败都是通过将消息重新投递到重试、失败Exchange来实现的,如果忘记ack,则该消息在超时或者连接断开后,会重新被重新投递给消费者,如果消费者依旧无法处理,则会造成死循环。

1.7K20

Java开发利器之重试

业务场景: 代码中存在依赖不稳定的场景,需要使用重试获取预期结果或者尝试重新执行逻辑不立即结束,比如远程接口访问,数据加载访问,数据上传校验等 对于异常需要重试的场景,同时希望把正常逻辑和重试逻辑解耦...无法保证高可用 多线程情况下上面的代码会出现并发问题,因为第一次调用的结果不一定是最早返回的,有可能后面调用的先返回,导致结果不是预期的 性能问题,如果使用多线程要考虑线程创建销毁和切换问题 当然这些问题自己实现完全可以解决...而且支持多个异常或者自定义实体对象的重试源,让重试功能有更多的灵活性 线程安全,我们只需要关注我们的业务逻辑实现即可 内部使用线程池管理线程 基于命令模式使用链式调用,使用方便 pom依赖: <dependency...3); // 一共重试3次, 可以做成配置化 return response.orElse(null); RetryUtil是我对guava-retrying的封装实现,下面的代码大家可以直接拿去使用...还有RxJava里有个retry的api也能实现类似的用法,感兴趣的同学可以研究下。 ? 点个在看支持我吧,转发就更好了

71610

spring-retry实现重试功能

今天来学习一下spring-retry实现重试功能,在实际项目中这种场景也是比较常见的,如果我们自己用代码实现,但是这种方式侵入性太强,不够优雅 原理 基于aop来实现的 如果找不到注解则自行添加 <...; return ResponEntity.success(); } } 参数说明 value:抛出指定异常才会重试 include:和value一样,默认为空,当exclude...也为空时,默认所有异常 exclude:指定不处理的异常 maxAttempts:最大重试次数,默认3次 @Backoff注解 delay:指定延迟后重试 multiplier:指定延迟的倍数,...比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒 @Recover 当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。...Retryable方法一致 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的) 该回调方法与重试方法写在同一个实现类里面

42120

Java之Retry重试机制详解

优雅重试方案尝试 应用命令设计模式解耦正常和重试逻辑 命令设计模式具体定义不展开阐述,主要该方案看中命令模式能够通过执行对象完成接口操作逻辑,同时内部封装处理重试逻辑,不暴露实现细节,对于调用者来看就是执行了正常逻辑...IRetry约定了上传和重试接口,其实现类OdpsRetry封装ODPS上传逻辑,同时封装重试机制和重试策略。与此同时使用recover方法在结束执行做恢复操作。...而我们的调用者LogicClient无需关注重试,通过重试者Retryer实现约定接口功能,同时 Retryer需要对重试逻辑做出响应和处理, Retryer具体重试处理又交给真正的IRtry接口的实现类...通过采用命令模式,优雅实现正常逻辑和重试逻辑分离,同时通过构建重试者角色,实现正常逻辑和重试逻辑的分离,让重试有更好的扩展性。...Guava Retryer也是线程安全的,入口调用逻辑采用的是Java.util.concurrent.Callable的call方法。

1.6K20

Linkerd 通过 ServiceProfile 实现超时和重试

另外需要注意的是服务配置文件并不是简单的服务与 Linkerd 一起运行所必需的,它们是可选的配置位,可以实现 Linkerd 的更高级行为,它们也是 Linkerd 使用 Kubernetes CRD...生成服务配置文件 Linkerd 的服务配置文件是通过实例化一个名为 ServiceProfile 的 Kubernetes CRD 来实现的。...我们可以先了解下负载均衡,Linkerd 会自动在可能的目的地之间对请求进行负载均衡,请注意请求这个词 - 与四层或 TCP 负载均衡不同,它会均衡连接,Linkerd 将建立到可能的端点集的连接,并在所有这些连接之间均衡请求...流量升级到代理之间的 HTTP/2 连接。...如果底层错误不是暂时的,或者如果 Linkerd 无法重试,那么应用程序仍然需要处理这些错误。 在实践中,实现重试可能会很麻烦。

66920

java retry(重试) spring retry, guava retrying 详解

转载 自 http://blog.51cto.com/9250070/2156431 系列说明 java retry 的一步步实现机制。...java-retry 源码地址 情景导入 简单的需求 产品经理:实现一个按条件,查询用户信息的服务。 小明:好的。没问题。...CGLIB CGLIB 是一个功能强大、高性能和高质量的代码生成库,用于扩展JAVA类并在运行时实现接口。 javassist javassist (Java编程助手)使Java字节码操作变得简单。...ASM提供与其他Java字节码框架类似的功能,但主要关注性能。 因为它的设计和实现都尽可能地小和快,所以非常适合在动态系统中使用(当然也可以以静态的方式使用,例如在编译器中)。...约定重试间隔,差异性重试策略,设置重试超时时间,进一步保证重试有效性以及重试流程稳定性。 都使用了命令设计模式,通过委托重试对象完成相应的逻辑操作,同时内部封装实现重试逻辑。

1.4K30

RabbitMQ发布订阅实战-实现延时重试队列

本文将会讲解如何使用RabbitMQ实现延时重试和失败消息队列,实现可靠的消息消费,消费失败后,自动延时将消息重新投递,当达到一定的重试次数后,将消息投递到失败消息队列,等待人工介入处理。...在这里我会带领大家一步一步的实现一个带有失败重试功能的发布订阅组件,使用该组件后可以非常简单的实现消息的发布订阅,在进行业务开发的时候,业务开发人员可以将主要精力放在业务逻辑实现上,而不需要花费时间去理解...Show me the code 我分别用Java和PHP实现了本文所讲述的方案,读者可以通过参考代码以及本文中的基本步骤来更好的理解 rabbitmq-pubsub-php rabbitmq-pubsub-java...,连接断开后自动删除 no-wait false 该方法需要应答确认 auto-delete false 当不再使用时,是否自动删除 对于@retry重试队列,需要指定额外参数 'x-dead-letter-exchange...、失败都是通过将消息重新投递到重试、失败Exchange来实现的,如果忘记ack,则该消息在超时或者连接断开后,会重新被重新投递给消费者,如果消费者依旧无法处理,则会造成死循环。

3.2K40

利用 Promise 实现任务流的自动重试

微信小程序不支持 HTTP 的 cookie ,其会话机制是通过开发自己维护一个 session_id 在小程序的本地存储中,每次调用 wx.request 的时候都带上这个 session_id 来实现的会话机制...传统的实现方案 1.理想的实现情况 let session_id = wx.getStorageSync('session_id');   wx.request({     url: '/api/create...id=${id}`}) }) 不论我们业务有多少次 HTTP 请求要发送,request 函数都能自动帮我们处理好这些通用流程,且支持自动重试,自动执行原先断掉的流程。...let msg = resp.data;     msg && wx.showModal({title: '公告', content: msg}); }) 结语 这种基于 Promise 的任务流自动重试...演示代码为了突出重点,省略了 reject 和重试次数的处理部分,大家记得加上,要不然会出现外层的 catch 不到错误又或者是一直在循环重试

1.1K00

Java 远程调用失败?如何优雅的进行重试

; import java.util.concurrent.TimeUnit; @Service public class HelloService { public String sayHello...因此小伙伴能想到的是不是有简单的方式来进行重试,有的人已经帮我们想好了,可以通过 @Retryable 注解来实现一样的效果,接下来阿粉就给大家演示一下如何使用这个注解。...; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy...maxAttempts:重试次数; backoff:指定用于重试此操作的属性; listeners:重试监听器 bean 名称; 配合上面的一些属性的使用,我们就可以达到通过注解简单来实现方法调用异常后的自动重试...我们可以在执行重试方法的时候设置自定义的重试拦截器,如下所示,自定义重试拦截器需要实现 MethodInterceptor 接口并实现 invoke 方法,不过要注意,如果使用了拦截器的话,那么方法上的参数就会被覆盖

83120

JAVA数据库连接池_java与数据库的连接怎么实现

一般来说,Java应用程序访问数据库的过程是:   ①装载数据库驱动程序;   ②通过jdbc建立数据库连接;   ③访问数据库,执行sql语句;   ④断开数据库连接。...② 实现getConnection()从连接库中获取一个可用的连接 ③ returnConnection(conn) 提供将连接放回连接池中方法 ConnectionPool.java 数据库连接池类...; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException...; import java.sql.Statement; import java.util.Enumeration; import java.util.Vector; public class ConnectionPool...import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException

4.3K30

java与数据库连接的步骤_java与数据库的连接怎么实现

1.加载驱动 Class.forname(数据库驱动名); 2.建立数据库连接 使用DriverManager类的getConnection()静态方法来获取数据库连接对象,其语法格式如下所示: Connection...conn=DriverManager.getConnection(String url,String user,String pass); 其中url–数据库连接字符串. user—数据库的用户名 pass...—数据库密码 3.创建Statement对象 对数据库进行操作或访问时,需要使用sql语句,在Java语言中,sql语句通过Statement对象进行封装,发送给数据库。...5.关闭数据库 (1)关闭结果集 (2)关闭Statement对象 (3)关闭连接 连接mysql数据库代码如下: package practice; import java.sql.*; import...java.util.Collection; public class test1 { public static void main(String args[]) { String driver

2.3K20
领券