java - 在 Spring 关闭时从 DB 中删除 quartz 触发器

标签 java spring quartz-scheduler

我目前正在使用下面的配置在 spring 下运行 Quartz。使用数据库作为调度程序后端的原因是为了启用集群模式。

这一切都工作正常,但如果我想删除 InitialAbstractPublicationJob,我就会遇到问题。假设我删除了下面的所有配置,除了调度程序本身。数据库表 QRTZ_TRIGGERS 中仍然存在一行。

  TRIGGER_NAME: initialAbstractTrigger
 TRIGGER_GROUP: DEFAULT
      JOB_NAME: initialAbstractDataAccessDelegator
     JOB_GROUP: DEFAULT
   IS_VOLATILE: 0
   DESCRIPTION: NULL
NEXT_FIRE_TIME: 1330953433511
PREV_FIRE_TIME: 1330953432511
 TRIGGER_STATE: WAITING
  TRIGGER_TYPE: SIMPLE
    START_TIME: 1330953336511
      END_TIME: 0
 CALENDAR_NAME: NULL
 MISFIRE_INSTR: 0
      JOB_DATA: NULL
1 row in set (0.00 sec)

这一行导致quartz尝试加载Spring中不再存在的AbstractPublicationJobBean,并且异常大量存在。所以我的问题是:是否可以配置调度程序以在 spring 关闭或启动时从数据库刷新触发器,并从 spring applicationContext.xml 重新创建触发器

<bean id="initialAbstractPublicationJob" class="bbc.forge.ibroadcast.snowball.InitialAbstractPublicationJob" />
<bean id="initialAbstractDataAccessDelegator" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="bbc.forge.ibroadcast.snowball.DelegatingJobBean"/>
    <property name="durability" value="false" />
    <property name="jobDataAsMap">
        <map>
            <entry key="job.bean.name" value="initialAbstractPublicationJob" >
            </entry>
            <entry key="sdtl.file.prefix" value="sdtl_" >
            </entry>
        </map>
    </property>
</bean>
<bean id="initialAbstractTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
     see the example of method invoking job above 
    <property name="jobDetail" ref="initialAbstractDataAccessDelegator" />
     10 seconds 
    <property name="startDelay" value="0" />
     repeat every n milliseconds 
    <property name="repeatInterval" value="1000" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="initialAbstractTrigger" />
        </list>
    </property>
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="applicationContextSchedulerContextKey">
        <value>applicationContext</value>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>


        </props>
    </property>

</bean>

最佳答案

重复问题:delete-trigger-in-quartz

如果你想在 spring 关闭时更新触发器,只需在 @PreDestroy 方法中执行这些操作即可。

关于java - 在 Spring 关闭时从 DB 中删除 quartz 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567609/

相关文章:

java - Groovy 到 Java 代码

java - 如何在 Spring 使用@scheduled注解

java.sql.SQLException : Column not found 异常

java - 在 JBOSS 7 中部署 Struts 2 项目

java - quartz 调度: Using DailyCalendar

java - 是否有可能控制反序列化文件时创建的对象数量

java - 在 Android 时钟中移动分针

java - 如何将 HTTPServletResponse 转换为 HttpEntity?

java - Quartz SimpleTrigger 事件立即触发,即使重复间隔晚了一段时间

java - Grails、作业、静态辅助方法和 Hibernate session