代码实例-设计模式-模板方法

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;
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值