resubmit 是一款为 java 设计的防止重复提交框架。
有时候手动加防止重复提交很麻烦,每次手动编写不利于复用。
所以希望从从简到繁实现一个工具,便于平时使用。
-
基于注解+字节码,配置灵活
-
自动适配常见的日志框架
-
支持编程式的调用
-
支持注解式,完美整合 spring
-
支持整合 spring-boot
<dependency>
<group>com.github.houbb</group>
<artifact>resubmit-core</artifact>
<version>${最新版本}</version>
</dependency>
- UserService.java
@Resubmit(ttl = 5)
public void queryInfo(final String id) {
System.out.println("query info: " + id);
}
- 测试代码
@Test(expected = ResubmitException.class)
public void errorTest() {
UserService service = ResubmitProxy.getProxy(new UserService());
service.queryInfo("1");
service.queryInfo("1");
}
相同的参数直接提交2次,就会报错。
- 测试场景2
如果等待超过指定的 5s,就不会报错。
@Test
public void untilTtlTest() {
UserService service = ResubmitProxy.getProxy(new UserService());
service.queryInfo("1");
DateUtil.sleep(TimeUnit.SECONDS, 6);
service.queryInfo("1");
}
属性 | 说明 | 默认值 |
---|---|---|
ttl() | 多久内禁止重复提交,单位为秒。 | 60s |
cache() | 缓存实现策略 | 默认为基于 ConcurrentHashMap 实现的基于内存的缓存实现 |
keyGenerator() | key 实现策略,用于唯一标识一个方法+参数,判断是否为相同的提交 | md5 策略 |
tokenGenerator() | token 实现策略,用于唯一标识一个用户。 | 基于 HttpServletRequest 中的固定属性获取 |
后面几个实现策略都支持自定义。
<dependency>
<group>com.github.houbb</group>
<artifact>resubmit-spring</artifact>
<version>${最新版本}</version>
</dependency>
- UserService.java
@Service
public class UserService {
@Resubmit(ttl = 5)
public void queryInfo(final String id) {
System.out.println("query info: " + id);
}
}
- SpringConfig.java
@ComponentScan("com.github.houbb.resubmit.test.service")
@EnableResubmit
@Configuration
public class SpringConfig {
}
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ResubmitSpringTest {
@Autowired
private UserService service;
@Test(expected = ResubmitException.class)
public void queryTest() {
service.queryInfo("1");
service.queryInfo("1");
}
}
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>resubmit-springboot-starter</artifactId>
<version>${最新版本}</version>
</dependency>
- UserService.java
这个方法实现和前面的一样。
@Service
public class UserService {
@Resubmit(ttl = 5)
public void queryInfo(final String id) {
System.out.println("query info: " + id);
}
}
- Application.java
启动入口
@SpringBootApplication
public class ResubmitApplication {
public static void main(String[] args) {
SpringApplication.run(ResubmitApplication.class, args);
}
}
@ContextConfiguration(classes = ResubmitApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ResubmitSpringBootStarterTest {
@Autowired
private UserService service;
@Test(expected = ResubmitException.class)
public void queryTest() {
service.queryInfo("1");
service.queryInfo("1");
}
}
-
优化 spring 对应的版本依赖
-
添加基于 redis 的 cache 实现
-
添加基于 mysql 的 cache 实现