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

(1)接口

 1 
12 public interface DataLock {
13 
14     /**
15      * 从数据库中查询一定数量的OrderTask,并进行lock,lock到指定条数就返回,如果lock不到就返回空集合
16      * @param modeSize 总模数
17      * @param modeNo 当前锁定模数
18      */
19     public List<OrderTask> lockDatas(int modeSize, int modeNo);
20     /**
21      * 根据id锁定一条数据
22      * @param id
23      * @return true已锁定,false未锁定
24      */
25     public abstract boolean lockSingleData(long id);
26     /**
27      * 解锁指定数据
28      */
29     public int unLock(long id);
30 
31     /**
32      * 解锁全部数据
33      */
34     public int unLockAll();
35 
36 }

(2)模板类

 2 
15 public abstract class DataLockImpl implements DataLock {
16     @Resource
17     protected OrderTaskDao orderTaskDao;
18     @Resource
19     protected RouteUtil routeUtil;
20 
21     protected int maxLockSize;
22 
23     protected int getSize;
24 
25     @Override
26     public List<OrderTask> lockDatas(int modeSize, int modeNo) {
27         List<OrderTask> consumeInfoLocks = new ArrayList<OrderTask>();
28         List<OrderTask> consumeInfos = getData();
29         for (OrderTask consumeInfo : consumeInfos) {
30             String pin = consumeInfo.getPin();
31             if (StringUtils.isEmpty(pin)) {
32                 continue;
33             }
34             if (modeNo != routeUtil.getMode(pin, modeSize)) {
35                 continue;
36             }
37             if (lockSingleData(consumeInfo.getId())) {
38                 consumeInfoLocks.add(consumeInfo);
39             }
40             if (consumeInfoLocks.size() >= maxLockSize) {
41                 break;
42             }
43         }
44         return consumeInfoLocks;
45     }
46     @Override
47     public abstract boolean lockSingleData(long id);
48 
49     public abstract List<OrderTask> getData();
50 
51     public void setMaxLockSize(int maxLockSize) {
52         this.maxLockSize = maxLockSize;
53     }
54 
55     public void setGetSize(int getSize) {
56         this.getSize = getSize;
57     }
58 
59 }

(3)具体类

15 @Service(value = "addConsumeLock")
16 public class AddConsumeLock extends DataLockImpl {
17 
18     @Override
19     @Value("${addConsumeLock.getSize}")
20     public void setGetSize(int getSize) {
21         super.setGetSize(getSize);
22     }
23 
24     @Override
25     @Value("${addConsumeLock.maxLockSize}")
26     public void setMaxLockSize(int maxLockSize) {
27         super.setMaxLockSize(maxLockSize);
28     }
29 
30     @Override
31     public boolean lockSingleData(long id) {
32         return orderTaskDao.updateStatus(id, OrderTask.SYN_LOCK, OrderTask.SYN_WAIT) == 1;
33     }
34 
35     @Override
36     public int unLock(long id) {
37         return orderTaskDao.updateStatus(id, OrderTask.SYN_WAIT, OrderTask.SYN_LOCK);
38     }
39 
40     @Override
41     public List<OrderTask> getData() {
42         List<OrderTask> orderTasks = orderTaskDao.findOrderTasksByConsumeStatus(OrderTask.SYN_WAIT, getSize, false);
43         return orderTasks;
44     }
45 
46     @Override
47     public int unLockAll() {
48         return orderTaskDao.updateStatus(OrderTask.SYN_WAIT, OrderTask.SYN_LOCK);
49     }
50 }
 1 package com.jd.consume.service.lock.impl;
 2 
 3 import java.util.List;
 4 
 5 import org.springframework.beans.factory.annotation.Value;
 6 import org.springframework.stereotype.Service;
 7 
 8 import com.jd.consume.domain.OrderTask;
 9 
10 /**
11  * 计算等级数据锁定
12  * @author guanpanpan
13  *
14  */
15 @Service(value = "gradeLock")
16 public class GradeLock extends DataLockImpl {
17     @Override
18     @Value("${gradeLock.getSize}")
19     public void setGetSize(int getSize) {
20         super.setGetSize(getSize);
21     }
22 
23     @Override
24     @Value("${gradeLock.maxLockSize}")
25     public void setMaxLockSize(int maxLockSize) {
26         super.setMaxLockSize(maxLockSize);
27     }
28 
29     @Override
30     public boolean lockSingleData(long id) {
31         return orderTaskDao.updateGradeStatus(id, OrderTask.LEV_LOCK, OrderTask.LEV_WAIT) == 1;
32     }
33 
34     @Override
35     public int unLock(long id) {
36         return orderTaskDao.updateGradeStatus(id, OrderTask.LEV_WAIT, OrderTask.LEV_LOCK);
37     }
38 
39     @Override
40     public List<OrderTask> getData() {
41         List<OrderTask> consumeInfos = orderTaskDao.findOrderTasksByLevStatus(OrderTask.LEV_WAIT, getSize, false);
42         return consumeInfos;
43     }
44     @Override
45     public int unLockAll() {
46         return orderTaskDao.updateGradeStatus(OrderTask.LEV_WAIT, OrderTask.LEV_LOCK);
47     }
48 }

注:本示例来源于consume-grade-sql

posted on 2013-11-08 16:40  关攀攀  阅读(178)  评论(0)    收藏  举报

导航