liutingting068
2010-03-03 10:22
浏览 200
已采纳

有关quartz任务调度的一个问题

各位大侠帮我看看,谢谢!
举个例
我添加了一个任务,开始时间是2010年3月1日,结束时间是2010年5月1日,调度时间是在这段日期间每天上午10点钟调度
调度任务数据是保存在数据库中的,每当tomcat启动时都会去加载当天的任务放入调度列表中,当到每天10点再进行调度。
但当我2010年3月3日上午9点钟启动tomcat时,它就将我这个任务放入调度列表,而且进行了一次调度.当到达10点钟时又进行了一次调度
问题是当tomcat启动时,还没到10点钟它就进行了一次调度?
另一个例子
同上
我添加了一个任务,开始时间是2010年3月3日,结束时间是2010年4月1日,调度时间是在这段日期间每天上午10点钟调度,当我2010年3月3日中午12点钟启动tomcat时,它就将我这个任务放入调度列表,而且进行了一次调度。
问题是10点钟过了它还会进行一次调度。应该要到第二天的10点才调度的呀。当然如果我是3月3日9点钟启动tomcat,它就只将今天的任务放入调度列表,到了10点才会去调度。

这个问题我想是在tomcat启动时,它都会将所有任务列表上一次可以调度的进行调度一次。
怎么设置在tomcat启动时不会去调度上一次的,只有在下一次任务到达时才进行调度呢?
这个问题怎么解决。
我用的是spring+hibernate+struts2+quartz

quartz.properties 配置内容
#===============================================================
#Configure Main Scheduler Properties
#===============================================================
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO

#===============================================================
#Configure ThreadPool
#===============================================================
org.quartz.threadPool.threadCount = 1
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

#===============================================================
#Configure JobStore
#===============================================================
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.misfireThreshold = 60000

web.xml 配置内容

Quartz Initializer Servlet
QuartzInitializer

org.quartz.ee.servlet.QuartzInitializerServlet


config-file
/quartz.properties


shutdown-on-unload
true


start-scheduler-on-load
true

5

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • iteye_10013 2010-03-08 17:38
    已采纳

    Job 的可恢复性

    当一个 Job 还在执行中,Scheduler 经历了一次非预期的关闭,在 Scheduler 重启之后可恢复的 Job 还会再次被执行。这个 Job 会再次重头开始执行。Scheduler 是没法知道在程序停止的时候 Job 执行到了哪个位置,因此必须重新开始再执行一遍。

    要设置 Job 为可恢复性,用下面的方法:

    public void setRequestsRecovery(boolean shuldRecover);

    public void setRequestsRecovery(boolean shuldRecover);
    默认时,这个值为 false,Scheduler 不会试着去恢复 job 的。

    from .
    找下你的配置里面相关的属性吧.

    还有表:QRTZ_JOB_DETAILS 存储每一个已配置的 Job 的详细信息
    create table QRTZ_JOB_DETAILS (
    JOB_NAME varchar(80) not null,
    JOB_GROUP varchar(80) not null,
    DESCRIPTION varchar(120) null,
    JOB_CLASS_NAME varchar(128) not null,
    IS_DURABLE bit not null, <== 这个
    IS_VOLATILE bit not null, <== or这个
    IS_STATEFUL bit not null,
    REQUESTS_RECOVERY bit not null,
    JOB_DATA image null
    )
    go

    打赏 评论
  • 张洪財 2010-03-03 11:48

    没看到你10点钟调度开始的设置????

    打赏 评论
  • 张洪財 2010-03-03 11:49

    你添加的 ,开始时间是2010年3月3日,结束时间是2010年4月1日 也没看到?

    打赏 评论
  • 张洪財 2010-03-03 14:24

    如果存库的话应该用JobStore接口实现类在quartz.properties 中配置。再说了quartz.properties中需配置创建数据源。 没明白你的做法。

    org.quartz.simpl.RAMJobStore 这个应该是调度信息放到内存中。

    打赏 评论
  • wlx0710 2010-03-04 14:37

    在tomcat启动时,它都会去检测上一次有没有调度任务

    看了一遍Quartz的源代码也没找到RAMJobStore 启动时会检测上次调度任务的代码。
    只有其它两个jdbc的jobStore才有,它会检测有没有上一次有没有misfire的job,如果有也仅仅是发出一个notice给triggerListener

    我想是你用了什么其他的构架中扩展的功能吧,可能里面有对misfire的job自动执行一次

    当然只是猜想,水平有限。。。。。

    打赏 评论
  • 张洪財 2010-03-04 15:23

    如果任务是记录在JobStore中,启动tomcat可能会把没有执行的任务执行一遍,但你配置的是RAMJobStore就不应该了。 会不会有两个quartz.properties文件,默认一个或者某个地方还有一个。 或者是 quartz.xml 文件。

    打赏 评论
  • renwolang521 2010-03-09 13:58

    开始时间是2010年3月1日,结束时间是2010年5月1日,每天上午10点钟调度
    好像记得quartz是这样的,当你在2010.3.1日后启动的即 在quartz启动后发现当前的时间已经超过了你的开始时间,立刻进行一次调度,然后按照定时器的规则进行调度。

    打赏 评论
  • renwolang521 2010-03-09 14:15

    开始时间是2010年3月1日,结束时间是2010年5月1日,每天上午10点钟调度

    当你2010.3.1 10:00之前启动
    按照定时器规则执行;

    如果在 2010.3.1 10:00之后,2010.5.1 10:00之前启动
    调度器认为当前的时间超过了2010.3.1 10:00所以立刻执行一次调度
    然后按照定时器规则执行

    文档有提及

    打赏 评论

相关推荐 更多相似问题