最近有開(kāi)發(fā)一個(gè)任務(wù)調(diào)度里面最典型的應(yīng)用發(fā)短信
關(guān)于如何實(shí)現(xiàn)任務(wù)調(diào)度,有很多方法,可以自己寫(xiě)線程,也可以用一些開(kāi)源方案,
我用了quartz,大家可以去查查資料
這里主要講講搶占式的好處
一般我們都會(huì)把要做的任務(wù)放一張表里面,有一個(gè)字段是狀態(tài)來(lái)標(biāo)識(shí)是否已經(jīng)執(zhí)行過(guò)
。
比如我這個(gè)短信的,就有一張sendsms表
主要的字段有
sendid自增長(zhǎng)標(biāo)識(shí)符 content短信內(nèi)容 recevies接收號(hào)碼 status 狀態(tài)(0標(biāo)識(shí)未發(fā)
送,1發(fā)送過(guò)的)
我們很可能會(huì)寫(xiě)這樣一個(gè)SQL
select sendid,content,recevies from sendsms where status='0'
然后邏輯處理完成,發(fā)送了之后根據(jù)sendid 去update sendsms set status='1'
當(dāng)然如果只是一臺(tái)服務(wù)器需要掛這種發(fā)送短信的程序,這種方式?jīng)]有任何問(wèn)題。
但是有時(shí)候我們可能希望有更多的服務(wù)器來(lái)做這件事情來(lái)提高效率,比如我們
還是用上面的方式,會(huì)出現(xiàn)什么樣的情況呢?
隨便想一下就知道,很可能會(huì)出現(xiàn)一條短信被發(fā)送兩次的情況,用的服務(wù)器越多,這種情況出現(xiàn)的概率就越大,那么我們?cè)趺唇鉀Q,我講講我使用的一種利用搶占資源來(lái)解決的方案
首先我們要給短信表增加一個(gè)字段,比如sid
我們要做的就是給每個(gè)服務(wù)器一個(gè)唯一的編號(hào)。sid就是用來(lái)存放它,比如現(xiàn)在有兩臺(tái)服務(wù)器一個(gè)標(biāo)識(shí)為a,一個(gè)標(biāo)識(shí)為b
我們還需要一個(gè)短信的中間狀態(tài),待發(fā)送比如2
當(dāng)任務(wù)調(diào)度執(zhí)行到的時(shí)候這樣做
第一步,檢索這樣的記錄
select * from sendsms where status='2' and sid='a'
如果有這樣的記錄我們就執(zhí)行發(fā)送任務(wù)
如果沒(méi)有這樣的記錄,我們就去搶占資源,也就是
updae sendsms set status='2',sid='a' where status='0'
這樣當(dāng)下次任務(wù)調(diào)度到的時(shí)候,就有了資源,干活
而不同的服務(wù)器只要sid不同就可以了哦 這樣就算有很多的服務(wù)器都掛這個(gè)應(yīng)用也不會(huì)出現(xiàn)一條記錄多次執(zhí)行的情況了哦