一、service層介面設計
業務介面設計應當站在「使用者」角度設計介面,應遵循三個規範:合理的命令,明確的引數,返回結果(正常介面/異常結果)。建立設計的業務邏輯介面如下:
public inte***ce seckillservice
public seckill getbyid(long seckillid)
public exposer exportseckillurl(long seckillid)
date starttime=seckill.getstarttime();
date endtime=seckill.getendtime();
//系統當前時間
date nowtime=new date();
if(nowtime.gettime()endtime.gettime())
string md5=ge***5(seckillid);
return new exposer(true,md5,seckillid);
}private string ge***5(long seckillid)
@transactional
/** *使用註解控制事務方法的優點
* 1:開發團隊達成一致約定,明確標註事務方法的程式設計風格
* 2:保證事務方法的執行時間盡可能短,不要穿插其他網路請求,rpc/http請求或者剝離到事務方法外
* 3:不是所有的方法都需要事務,如只有一條修改操作,唯讀操作不需要事務控制
*/public seckillexecution executeseckill(long seckillid, long userphone, string md5) throws seckillexception, repeatkillexception, seckillcloseexception
//執行秒殺邏輯:減庫存+記錄購買行為
date nowtime=new date();
try elseelse
}}catch(seckillcloseexception e1) catch (repeatkillexception e2) catch (exception e)
}//丟擲異常是為了告訴spring是否rollback,此處使用儲存過程的話,就不需要拋異常了
public seckillexecution executeseckillprocedure(long seckillid, long userphone, string md5)
date killtime=new date();
mapmap=new hashmap();
map.put("seckillid",seckillid);
map.put("phone",userphone);
map.put("killtime",killtime);
map.put("result",null);
//執行儲存過程,result被賦值
try else
} catch (exception e)
}三、sping託管 service的實現類
本專案採用spring ioc :
1.xml配置
2.包掃瞄
3.annotation註解。
建立sping-service.xml
採用包掃瞄+註解方式,首先在xml中宣告包掃瞄:
<?xml version="1.0" encoding="utf-8"?>
xmlns:xsi=「
xmlns:context=「 xmlns:tx=「
xsi:schemalocation=「
/spring-beans.xsd
/spring-context.xsd
/spring-tx.xsd」
然後在org,forezp.service包下的類採用註解。比如@service 註解宣告是乙個service, @autowired注入service 所需依賴。
@service//宣告是乙個service
public class seckillserviceimpl implements seckillservice
只需要乙個包掃瞄和幾個簡單的註解就可以將service註解到spring ioc容器中。
四、spring宣告式事物
在秒殺案例中,我們需要採用事物來防止資料的正確性,防止重複秒殺,防止庫存不足、庫存剩餘等情況。一般使用事物需要開啟事物/經常一些列的操作,提交或者回滾。spring宣告式事物,就是將事物的開啟、提交等託管給spring管理,我們只需要注重如何修改資料。
配置spring 宣告式事物 在spring-service.xml中配置:
在需要事物的業務邏輯下加 @transactional註解。 比如在開啟秒殺方法:
@transactional
public seckillexecution executeseckill(long seckillid, long userphone, string md5) throws seckillexception, repeatkillexception, seckillcloseexception
注意:1開發團隊達成一致約定,明確標註事務方法的程式設計風格
2:保證事務方法的執行時間盡可能短,不要穿插其他網路請求,rpc/http請求或者剝離到事務方法外
3:不是所有的方法都需要事務,如只有一條修改操作,唯讀操作不需要事務控制
五、單元測試
需要配置:
@contextconfiguration() 直接上**:
@runwith(springjunit4classrunner.class)
@contextconfiguration()
public class seckillservicetest
@test
public void getbyid() throws exception
}@test
public void exportseckillurl() throws exception
@test
public void executeseckill() throws exception }
這篇文章主要講了service業務介面的編寫和實現,以及採用xml和註解方式講service 注入到spring ioc,以及宣告式事物
秒殺系統 併發處理
這種題目,小菜是準備過的,巴拉巴拉的說了一堆。面試官 那這裡是怎麼保證秒殺成功的?小菜 8 面試官 你這裡用了redis,有什麼用?小菜 面試官 你用什麼測試過這個系統的併發量?小菜 面試官 你覺得你這個系統還可以再優化麼?小菜 面試官 你知道這個系統的瓶頸在 嗎?如果流量再大10倍,怎麼應對?小菜...
高併發秒殺專案 05
頁面快取 改造goodscontroller中的方法,加入thymeleafviewresolver註解 手動渲染 springwebcontext ctx newspringwebcontext request,response,request.getservletcontext request....
活動秒殺解決併發問題
一 秒殺帶來了什麼?秒殺或搶購活動一般會經過 預約 搶訂單 支付 這3個大環節,而其中 搶訂單 這個環節是最考驗業務提供方的抗壓能力的。搶訂單環節一般會帶來2個問題 1 高併發 2 超賣 任何商品都會有數量上限,如何避免成功下訂單買到商品的人數不超過商品數量的上限,這是每個搶購活動都要面臨的難題。二...