将@Idempotent注解标注在bean的方法上,id为该幂等操作的唯一标识,使用spring-el语法
maxExecutionTime为该方法执行最大时间,超过该时间则id在redis中自动过期,duration为方法执行成功后
幂等持续时间
- TestPOJO.java,测试pojo类
public class TestPOJO {
private String username;
public TestPOJO(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
- TestBean.java,测试bean类
@Component
public class TestBean {
//使用spring-el来获取方法参数中的值
@Idempotent(id = "#testPOJO.getUsername()", rollbackFor = RuntimeException.class)
public void hello(TestPOJO testPOJO) {
System.out.println(String.format("hello %s\n", testPOJO.getUsername()));
}
}
- 测试
@Test
public void testSpring() {
testBean.hello(new TestPOJO("yuyuko"));
testBean.hello(new TestPOJO("yuyuko"));
}
- 输出
hello yuyuko
2019-09-12 22:59:56.729 INFO 11428 --- [ main] c.y.i.i.dubbo.IdempotentFilter : 拒绝执行方法[test],幂等操作id[idem:yuyuko]
###手动模式
@Autowired
IdempotentApi idempotentApi;
@Test
public void test(){
IdempotentInfo hello = IdempotentInfo.IdempotentInfoBuilder.builder().id("2").build();
idempotentApi.prepare(hello);
try{
System.out.println("hello")
}catch (RuntimeException ex){
idempotentApi.afterThrowing(hello.getId());
}
idempotentApi.after(hello);
}
将@Idempotent注解标注在dubbo的接口api上(注意是接口!),方法重复调用时默认返回null
所以请不要将注解标注在带返回值的具有副作用方法上.