基於SpringMVC+Spring+MyBatis實現秒殺系統【商務邏輯】

來源:互聯網
上載者:User

標籤:led   java   sage   自訂異常   rtti   over   系統   code   drive   

前言

       該篇主要實現秒殺業務層,秒殺商務邏輯裡主要包括暴露秒殺介面地址、實現秒殺商務邏輯。同時聲明了三個業務類:Exposer、SeckillExecution、SeckillResult。 Exposer主要用來實現暴露介面時一個md5的加密,防止使用者在用戶端篡改資料。根據seckillid產生md5,提交秒殺請求時會根據這個md5和seckillid比對是否是合法的請求。SeckillExecution主要封裝秒殺時的傳回值。

       SeckillExecution有2個屬性,state、stateinfo,這裡我沒有封裝枚舉值,還是用整型和字串給用戶端傳值,在Service裡看著也直觀些。

 

準備工作

1、spring-service.xml

     商務邏輯裡的關鍵是開啟事務,這裡推薦用註解的方式實現。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/context       http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">    <!--1、註解包掃描-->    <context:component-scan base-package="com.seckill.service"/>    <!--2、配置聲明式事務-->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <!--注入資料庫-->        <property name="dataSource" ref="dataSource"/>    </bean>    <!--3、配置基於註解的聲明式事務-->    <tx:annotation-driven transaction-manager="transactionManager"/></beans>

 

實現秒殺業務

     秒殺相關的關鍵方法就是最後兩個方法,一個是對外暴漏秒殺地址,一個是秒殺方法。

public interface SeckillService {    List<Seckill> getSeckillList();    Seckill getById(long seckillId);    /**對外暴漏秒殺介面**/    Exposer exposeSeckillUrl(long seckillId);    /**     * 執行秒殺操作,有可能成功,有可能失敗,所以這裡我們拋出自自訂異常     * ***/    SeckillExecution executeSeckill(long seckillId,long phone,String md5) throws SeckillException,            RepeatKillException,            SeckillCloseException;}

  

@Servicepublic class SeckillServiceImpl implements SeckillService {    /***     * 秒殺行為的枚舉放在這裡說明     * 1、 秒殺成功     * 0、 秒殺結束     * -1、重複秒殺     * -2、系統異常     * -3、資料篡改     * ***/    private Logger logger = LoggerFactory.getLogger(this.getClass());    @Autowired    SeckillDao seckillDao;    @Autowired    SuccessKillDao successKillDao;    private String salt = "zhangfei";    @Override    public List<Seckill> getSeckillList() {        return seckillDao.queryAll(0, 100);    }    @Override    public Seckill getById(long seckillId) {        return seckillDao.queryById(seckillId);    }    @Override    public Exposer exposeSeckillUrl(long seckillId) {        Seckill seckill = getById(seckillId);        Date startTime = seckill.getStartTime();        Date endTime = seckill.getEndTime();        Date now = new Date();        if (now.getTime() < startTime.getTime() || now.getTime() > endTime.getTime()) {            return new Exposer(false, seckillId, startTime.getTime(), endTime.getTime(), now.getTime());        }        String md5 = getMd5(seckillId);        return new Exposer(true, md5, seckillId);    }    @Override    @Transactional    public SeckillExecution executeSeckill(long seckillId, long phone, String md5)            throws SeckillException,RepeatKillException,SeckillCloseException {        if (md5 == null || !md5.equals(getMd5(seckillId))) {            throw new SeckillException("非法請求");        }        Date now = new Date();        try {            int insertCount = successKillDao.insertSuccessKilled(seckillId, phone);            if (insertCount <= 0) {                throw new RepeatKillException("重複秒殺");            } else {                int updateCount = seckillDao.reduceNumber(seckillId, now);                if (updateCount <= 0) {                    throw new SeckillCloseException("秒殺已關閉");                } else {                    //秒殺成功,可以把秒殺詳情和商品詳情實體返回                    SuccessKilled successKilled = successKillDao.queryByIdWithSeckill(seckillId, phone);                    return new SeckillExecution(seckillId, 1, "秒殺成功", successKilled);                }            }        } catch (SeckillCloseException e) {            throw e;        } catch (RepeatKillException e1) {            throw e1;        } catch (SeckillException e2) {            logger.error(e2.getMessage(), e2);            throw new SeckillException("Unkonwn error:" + e2.getMessage());        }    }    private String getMd5(long seckillId) {        String base = seckillId + "/" + salt;        String md5 = DigestUtils.md5DigestAsHex(base.getBytes());        return md5;    }}

  

 

基於SpringMVC+Spring+MyBatis實現秒殺系統【商務邏輯】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.