java时间触发器_用java.util.timer在web工程中实现类似触发器的机制 [转]

用java.util.timer在web工程中实现类似触发器的机制

现在正在做的项目要实现一个定时出帐的触发器, 开始打算用spring整合的quartz工具来实现(同时spring也提供了对java.util.timer的支持),

spring对quartz整合的方式,是在配置文件中通过bean的property项设置一个crontrigger表达式来实现精确的时点触发,但是由于spring只有在启动的时候对注入值进行读取,这样的话就很难实现通过运行时读取配置参数,达到不用重启服务即可改变出帐时间的目的,所以只好自己寻找好一点的解决方案.

在网上找到了,看了很受启发,我略做了一些修改,实现了在每个月的某一天的某一个时间进行任务操作的功能.

代码及注释如下:

先要实现一个系统的监听器:

/**

*

title:

*

description:

*

copyright: copyright (c)chen meng 2005

*

company: 陈盟

*

*

@author

陈盟

*

@version

1.0

*

@since

2005-1-13 / 17:26:41

*/

package

com.wellsoon.cttbj.vab.background;

import

java.util.date;

import

javax.servlet.servletcontextevent;

import

javax.servlet.servletcontextlistener;

public

class

settleaccountlistener

implements

servletcontextlistener {

private

java.util.timer timer

=

null

;

/*

* @see javax.servlet.servletcontextlistener#contextinitialized(javax.servlet.servletcontextevent)

*/

public

void

contextinitialized(servletcontextevent event) {

date taskrun

=

null

;

//

todo auto-generated method stub

taskrun

=

new

date();

timer

=

new

java.util.timer(

true

);

event.getservletcontext().log(定时器已启动);

/

在这里每隔一分钟轮询一次出帐任务,如果任务间隔比较大的话建议把这个值设的大一点,但此设置值将间接影响可设定的触发精度.

timer.schedule(

new

settleaccounttask(),

0

,

60

*

1000

);

/

event.getservletcontext().log(已经添加任务调度表);

}

/*

* @see javax.servlet.servletcontextlistener#contextdestroyed(javax.servlet.servletcontextevent)

*/

public

void

contextdestroyed(servletcontextevent event) {

//

todo auto-generated method stub

timer.cancel();

event.getservletcontext().log(定时器销毁);

}

}

接着来看settleaccounttask的实现:

/**

*

title:

*

description:

*

copyright: copyright (c)chen meng 2005

*

company: 陈盟

*

*

@author

陈盟

*

@version

1.0

*

@since

2005-1-13 / 17:35:55

*/

package

com.wellsoon.cttbj.vab.background;

import

java.util.calendar;

import

java.util.date;

import

java.util.timertask;

public

class

settleaccounttask

extends

timertask {

private

static

boolean

isrunning

=

false

;

private

static

long

dotaskmillis

=

0l

;

public

void

run() {

system.out.println(dotaskmillis);

//

下面两个值代表每月的哪一天几点进行实际任务操作.可以通过数据库查询获得

int

c_schedule_date

=

10

;

int

c_schedule_hour

=

4

;

calendar cal

=

calendar.getinstance();

//

如果任务量很大,在下次轮询时仍在执行上次轮询的任务,则跳过本次执行,直接错过.

if

(

!

isrunning) {

//

如果当前系统时间的day_of_month和hour_of_day不满足以下条件,则跳过实际操作.

if

(c_schedule_date

==

cal.get(calendar.day_of_month) && c_schedule_hour

==

cal.get(calendar.hour_of_day)) {

//

如果上次执行任务的时间距此次轮询时间间隔太短,则跳过实际操作.

if

((dotaskmillis

2

*

60

*

60

*

1000

)

<

cal.gettimeinmillis()) {

//

详细任务

isrunning

=

true

;

system.out.println(执行出帐操作);

dotaskmillis

=

cal.gettimeinmillis();

system.out.println(dotaskmillis);

isrunning

=

false

;

}

}

}

else

{

system.out.println(错过);

}

}

}

最后,在web.xml中加上

com.xxx.background.settleaccountlistener

就可以了.

如果有更好的解决方式, 希望您回复.

posted on 2007-01-22 17:35 Lib 阅读(2660) 评论(0)  编辑  收藏 所属分类: Java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值