java 抢占资源 解决_抢占式任务调度的一种实现

最近有开发一个任务调度里面最典型的应用发短信

关于如何实现任务调度,有很多方法,可以自己写线程,也可以用一些开源方案,

我用了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不同就可以了哦  这样就算有很多的服务器都挂这个应用也不会出现一条记录多次执行的情况了哦

posted on 2009-06-26 16:32 feng 阅读(2340) 评论(8)  编辑  收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值