Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

lenjey/idempotent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

24 Commits

Repository files navigation

幂等组件 - idempotent

  • 在软件开发中,重复提交、重复通知、补偿交易防重等场景的问题都属于需要处理的幂等问题;
  • 一个幂等操作的特点,是任意多次执行所产生的影响均与一次执行的影响相同。重复执行不会影响系统状态,也不用担心会对系统数据造成破坏;
  • 本组件就是为了解决这些问题而开发的,简单易用。支持 "幂等有效期设置""响应策略设置""幂等参数指定" 等特性。

1、代码中的使用方式(通过注解使用)

1)注解的几个简便使用示例

 @Idempotent
 public int saveUserAccount(UserAccountDto userAccount) {
 // ...
 return userAccountMapper.saveUserAccount(userAccount);
 }
 
 @Idempotent(idempotentMinutes = 1440)
 public int saveUserAccount(UserAccountDto userAccount) {
 // ...
 return userAccountMapper.saveUserAccount(userAccount);
 }
 
 @Idempotent(idempotentColumns = { "nickName", "sex" }, idempotentMinutes = 1440)
 public int saveUserAccount(String nickName, int sex) {
 // ... 
 return userAccountMapper.saveUserAccount(userAccount);
 }
 @Idempotent(idempotentColumns = { "userAccount.nickName", "userAccount.sex" }, idempotentMinutes = 1440)
 public int saveUserAccount(UserAccountDto userAccount) {
 // ... 
 return userAccountMapper.saveUserAccount(userAccount);
 }
 
 @Idempotent(idempotentColumns = { "userAccount.nickName", "userAccount.sex" }, idempotentMinutes = 1440, responseStrategy = 1)
 public int saveUserAccount(UserAccountDto userAccount) {
 // ... 
 return userAccountMapper.saveUserAccount(userAccount);
 }

2)注解的完整参数使用示例

 @Idempotent(
 idempotentColumns = { "userAccount.nickName", "userAccount.sex" }, 
 prjName = "test project", 
 interfaceName = "UserServiceImpl.saveUserAccount", 
 idempotentMinutes = 1440, 
 responseStrategy = 1
 idempotentParamOnly = true, 
 )
 public int saveUserAccount(UserAccountDto userAccount) {
 // ...
 return userAccountMapper.saveUserAccount(userAccount);
 }

3)注解的参数详解

idempotentColumns:唯一确定一次请求的参数集合(如果不设置,默认取所有参数)
prjName:服务名称(默认取spring.application.name定义的名称)
interfaceName:接口名称(默认取'类名.方法名')
idempotentMinutes:幂等有效期时间(单位分钟,默认0-长期有效)
responseStrategy:响应策略(0-返回上次成功的请求结果(默认);1-重复请求提醒)
idempotentParamOnly:请求参数是否只记录幂等字段(true/false, 默认false。有些参数如果记录下来比较大,比如,文件对象,可以设置为true,只记录幂等参数)

2、集成方式

1)在自己的项目中添加maven依赖(请关注maven中央仓库中的版本)

 <dependency>
 <groupId>com.github.andy-a-coder</groupId>
 <artifactId>idempotent</artifactId>
 <version>${version}</version>
 </dependency>

2)yaml配置

本组件依赖mysql、redis、mybatis,按spring-boot的要求在自己的项目中配置即可

以下是配置示例

server:
 port: 8080
spring:
 application:
 name: idempotent-test
 datasource:
 url: jdbc:mysql://127.0.0.1:3306/i_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
 username: root
 password: 123456
 driver-class-name: com.mysql.jdbc.Driver
 type: com.zaxxer.hikari.HikariDataSource
 minimum-idle: 5
 maximum-pool-size: 100
 idle-timeout: 30000
 max-lifetime: 1800000
 connection-timeout: 30000
 connection-test-query: SELECT 1
 redis:
 host: 127.0.0.1
 port: 6379
 timeout: 5000
mybatis:
 configuration:
 map-underscore-to-camel-case: true # 本组件使用的mybatis注解操作的idempotent_request表,加了这个配置可以把下划线分隔的库表字段自动转换为camel格式
 

3)创建幂等记录存储表(脚本见: /src/main/resources/idempotent.sql)

3、幂等请求的处理流程图(flow.png)

About

A simple idempotent component

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%

AltStyle によって変換されたページ (->オリジナル) /