yangyoupeng

防止重复提交的而判断

......@@ -89,8 +89,8 @@ public class ExcludeLock {
BoundValueOperations<String, String> valuOper = redisTemplate.boundValueOps(lockKeyPath);
while (timeout >= 0) {
final Lock newLock = asLock(System.currentTimeMillis() + lockExpiryInMillis);
valuOper.expire(lockExpiryInMillis,TimeUnit.MILLISECONDS);
Boolean result = valuOper.setIfAbsent(newLock.toString());
valuOper.expire(lockExpiryInMillis,TimeUnit.MILLISECONDS);
if (result) {
this.lock = newLock;
return true;
......
package com.zhaoonline.redis.token;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zhaoonline.redis.template.RedisTemplateFactory;
@Configuration
public class MultiSubmitTokenBeanConfig {
@Bean
public Token<Long> token(RedisTemplateFactory factory){
Token<Long> token =new Token<Long>(factory);
return token;
}
@Bean
public MultiSubmitToken multiSubmitToken(Token<Long> token){
MultiSubmitToken mulitSubmitToken=new MultiSubmitToken(token);
return mulitSubmitToken;
}
}
......@@ -22,18 +22,21 @@ public class Token<T> {
private final int tokenExpiryInMillis;
private final static String defaultTokenNameSpace="token:";
private String tokenNameSpace;
private static final int ONE_SECOND = 1000;
public static final int DEFAULT_EXPIRY_TIME_MILLIS = Integer.getInteger("com.zhaoonline.redis.token.expiry.millis",
60 * ONE_SECOND);
public static final int DEFAULT_ACQUIRY_RESOLUTION_MILLIS = Integer
.getInteger("com.zhaoonline.redis.token.acquiry.resolution.millis", 100);
500);
// public static final int DEFAULT_ACQUIRY_RESOLUTION_MILLIS = Integer
// .getInteger("com.zhaoonline.redis.token.acquiry.resolution.millis", 100);
private RedisTemplate<String, T> redisTemplate;
public Token(RedisTemplateFactory factory){
this(factory,DEFAULT_EXPIRY_TIME_MILLIS,defaultTokenNameSpace);
this(factory,DEFAULT_EXPIRY_TIME_MILLIS);
}
public Token(RedisTemplateFactory factory,int expiryTimeMillis){
this(factory,expiryTimeMillis,defaultTokenNameSpace,new SafeEncodeSerializer(),new GenericJackson2JsonRedisSerializer() );
}
public Token(RedisTemplateFactory factory,int expiryTimeMillis,String tokenNameSpace){
this(factory,expiryTimeMillis,defaultTokenNameSpace,new SafeEncodeSerializer(),new GenericJackson2JsonRedisSerializer() );
}
......@@ -49,11 +52,10 @@ public class Token<T> {
this.tokenNameSpace=tokenNameSpace;
}
public boolean addToken(String key,T token){
BoundValueOperations<String, T> valuOper = redisTemplate.boundValueOps(buildTokenKeyWithNameSpace(key));
valuOper.expire(getTokenExpiryInMillis(), TimeUnit.MILLISECONDS);
boolean result=valuOper.setIfAbsent(token);
valuOper.expire(getTokenExpiryInMillis(), TimeUnit.MILLISECONDS);
return result;
}
private String buildTokenKeyWithNameSpace(String key){
......
......@@ -32,4 +32,59 @@ public class TestMultiSubmitToken extends RepositoryCommonBase {
submitToken.deleteSubmitToken(testTokenName);
}
@Test
public void testMultiSubmit() throws InterruptedException{
Token<Long> timestampToken=new Token<Long>(factory,200);
String testTokenName="tokentest1";
MultiSubmitToken submitToken=new MultiSubmitToken(timestampToken);
submitToken.deleteSubmitToken(testTokenName);
boolean addResult=submitToken.addSubmitToken(testTokenName, 1L);
assertTrue(addResult);
Thread.sleep(50);
addResult=submitToken.addSubmitToken(testTokenName, 2L);
assertTrue(addResult);
Long value=submitToken.getSubmmitToken(testTokenName);
assertEquals(new Long(2), value);
submitToken.deleteSubmitToken(testTokenName);
}
@Test
public void testNotDelete() throws InterruptedException{
Token<Long> timestampToken=new Token<Long>(factory,200);
String testTokenName="tokentest1";
MultiSubmitToken submitToken=new MultiSubmitToken(timestampToken);
submitToken.deleteSubmitToken(testTokenName);
boolean addResult=submitToken.addSubmitToken(testTokenName, 1L);
assertTrue(addResult);
Thread.sleep(100);
Long value=submitToken.getSubmmitToken(testTokenName);
assertNull(value);
}
}
......