最近有开发一个任务调度里面最典型的应用发短信
关于如何实现任务调度,有很多方法,可以自己写线程,也可以用一些开源方案,
我用了quartz,大家可以去查查资料
这里主要讲讲抢占式的好处
一般我们都会把要做的任务放一张表里面,有一个字段是状态来标识是否已经执行过
。
比如我这个短信的,就有一张sendsms表
主要的字段有
sendid自增长标识符 content短信内容 recevies接收号码 status 状态(0标识未发
送,1发送过的)
我们很可能会写这样一个SQL
select sendid,content,recevies from sendsms where status='0'
然后逻辑处理完成,发送了之后根据sendid 去update sendsms set status='1'
当然如果只是一台服务器需要挂这种发送短信的程序,这种方式没有任何问题。
但是有时候我们可能希望有更多的服务器来做这件事情来提高效率,比如我们
还是用上面的方式,会出现什么样的情况呢?
随便想一下就知道,很可能会出现一条短信被发送两次的情况,用的服务器越多,这种情况出现的概率就越大,那么我们怎么解决,我讲讲我使用的一种利用抢占资源来解决的方案
首先我们要给短信表增加一个字段,比如sid
我们要做的就是给每个服务器一个唯一的编号。sid就是用来存放它,比如现在有两台服务器一个标识为a,一个标识为b
我们还需要一个短信的中间状态,待发送比如2
当任务调度执行到的时候这样做
第一步,检索这样的记录
select * from sendsms where status='2' and sid='a'
如果有这样的记录我们就执行发送任务
如果没有这样的记录,我们就去抢占资源,也就是
updae sendsms set status='2',sid='a' where status='0'
这样当下次任务调度到的时候,就有了资源,干活
而不同的服务器只要sid不同就可以了哦 这样就算有很多的服务器都挂这个应用也不会出现一条记录多次执行的情况了哦