1.接口
package com.jd.consume.domain.lock;
import java.util.List;
import com.jd.consume.domain.model.OrderTask;
/**
* 用户消费任务锁定
* @author guanpanpan
*
*/
public interface DataLock {
/**
* 从数据库中查询一定数量的OrderTask,并进行lock,lock到指定条数就返回,如果lock不到就返回空集合
* @param modeSize 总模数
* @param modeNo 当前锁定模数
*/
public List<OrderTask> lock(int modeSize, int modeNo);
/**
* 解锁指定数据
*/
public int unLock(long id);
}
2.抽象实现类
package com.jd.consume.domain.lock.impl;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import com.jd.consume.domain.lock.DataLock;
import com.jd.consume.domain.model.OrderTask;
import com.jd.consume.infrastructure.repository.OrderTaskRepository;
import com.jd.consume.infrastructure.util.RouteUtil;
public abstract class DataLockImpl implements DataLock {
@Resource
protected OrderTaskRepository orderTaskRepository;
@Resource
protected RouteUtil routeUtil;
protected int maxLockSize;
protected int getSize;
@Override
public List<OrderTask> lock(int modeSize, int modeNo) {
List<OrderTask> consumeInfoLocks = new ArrayList<OrderTask>();
List<OrderTask> consumeInfos = getData();
for (OrderTask consumeInfo : consumeInfos) {
String pin = consumeInfo.getPin();
if (StringUtils.isEmpty(pin)) {
continue;
}
if (modeNo != routeUtil.getMode(pin, modeSize)) {
continue;
}
if (lockSingleData(consumeInfo.getId())) {
consumeInfoLocks.add(consumeInfo);
}
if (consumeInfoLocks.size() >= maxLockSize) {
break;
}
}
return consumeInfoLocks;
}
public abstract boolean lockSingleData(long id);
public abstract List<OrderTask> getData();
public void setMaxLockSize(int maxLockSize) {
this.maxLockSize = maxLockSize;
}
public void setGetSize(int getSize) {
this.getSize = getSize;
}
}
3.具体实现类
package com.jd.consume.domain.lock.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.jd.consume.domain.model.OrderTask;
/**
* 加消费额度锁定
* @author guanpanpan
*
*/
@Service(value = "addConsumeLock")
public class AddConsumeLock extends DataLockImpl {
@Override
@Value("${addConsumeLock.getSize}")
public void setGetSize(int getSize) {
super.setGetSize(getSize);
}
@Override
@Value("${addConsumeLock.maxLockSize}")
public void setMaxLockSize(int maxLockSize) {
super.setMaxLockSize(maxLockSize);
}
@Override
public boolean lockSingleData(long id) {
return orderTaskRepository.updateCusumeStatus(id, OrderTask.SYN_LOCK, OrderTask.SYN_WAIT) == 1;
}
@Override
public int unLock(long id) {
return orderTaskRepository.updateCusumeStatus(id, OrderTask.SYN_WAIT, OrderTask.SYN_LOCK);
}
@Override
public List<OrderTask> getData() {
List<OrderTask> orderTasks = orderTaskRepository.findOrderTasksByConsumeStatus(OrderTask.SYN_WAIT, getSize, false);
return orderTasks;
}
}
package com.jd.consume.domain.lock.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.jd.consume.domain.model.OrderTask;
/**
* 减消费额数据锁定
* @author guanpanpan
*
*/
@Service(value = "pastConsumeLock")
public class PastConsumeLock extends DataLockImpl {
@Override
@Value("${pastConsumeLock.getSize}")
public void setGetSize(int getSize) {
super.setGetSize(getSize);
}
@Override
@Value("${pastConsumeLock.maxLockSize}")
public void setMaxLockSize(int maxLockSize) {
super.setMaxLockSize(maxLockSize);
}
@Override
public boolean lockSingleData(long id) {
return orderTaskRepository.updatePastCusumeStatus(id, OrderTask.PAST_LOCK, OrderTask.SYN_COMPLETE) == 1;
}
@Override
public int unLock(long id) {
return orderTaskRepository.updatePastCusumeStatus(id, OrderTask.SYN_COMPLETE, OrderTask.PAST_LOCK);
}
@Override
public List<OrderTask> getData() {
List<OrderTask> consumeInfos = orderTaskRepository.findPastOrderTasks(getSize);
return consumeInfos;
}
}
package com.jd.consume.domain.lock.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.jd.consume.domain.model.OrderTask;
/**
* 计算等级数据锁定
* @author guanpanpan
*
*/
@Service(value = "gradeLock")
public class GradeLock extends DataLockImpl {
@Override
@Value("${gradeLock.getSize}")
public void setGetSize(int getSize) {
super.setGetSize(getSize);
}
@Override
@Value("${gradeLock.maxLockSize}")
public void setMaxLockSize(int maxLockSize) {
super.setMaxLockSize(maxLockSize);
}
@Override
public boolean lockSingleData(long id) {
return orderTaskRepository.updateCusumeLevStatus(id, OrderTask.LEV_LOCK, OrderTask.LEV_WAIT) == 1;
}
@Override
public int unLock(long id) {
return orderTaskRepository.updateCusumeLevStatus(id, OrderTask.LEV_WAIT, OrderTask.LEV_LOCK);
}
@Override
public List<OrderTask> getData() {
List<OrderTask> consumeInfos = orderTaskRepository.findOrderTasksByLevStatus(OrderTask.LEV_WAIT, getSize, false);
return consumeInfos;
}
}