当前位置: 首页 > 知识库问答 >
问题:

如何利用调度器触发Spring Quartz触发器

单于正业
2023-03-14
<beans default-autowire="byName"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!-- Quartz Scheduler -->
    <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="dataSource" ref="itc5DataSource" />
        <property name="applicationContextSchedulerContextKey" value="applicationContext" />
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.scheduler.instanceName">${cepis.portal.scheduler.name}</prop>
                <prop key="org.quartz.scheduler.instanceId">${cepis.portal.scheduler.instanceId}</prop>
                <prop key="org.quartz.threadPool.class">${cepis.portal.scheduler.threadPool.class}</prop>
                <prop key="org.quartz.threadPool.threadCount">${cepis.portal.scheduler.threadPool.threadCount}
                </prop>
                <prop key="org.quartz.jobStore.class">${cepis.portal.scheduler.jobStore.class}</prop>
                <prop key="org.quartz.jobStore.isClustered">${cepis.portal.scheduler.jobStore.isClustered}</prop>
                <prop key="org.quartz.jobStore.useProperties">${cepis.portal.scheduler.jobStore.useProperties}
                </prop>
                <prop key="org.quartz.jobStore.tablePrefix">${cepis.portal.scheduler.jobStore.tablePrefix}</prop>
                <prop key="org.quartz.jobStore.driverDelegateClass">${cepis.portal.scheduler.jobStore.driverDelegateClass}
                </prop>
                <prop key="org.quartz.jobStore.selectWithLockSQL">${cepis.portal.scheduler.jobStore.selectWithLockSQL}
                </prop>
            </props>
        </property>

        <property name="jobDetails">
            <list>
                <ref bean="updateNoShowAppointmentJob" />           
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="updateNoShowTrigger" />          
            </list>
        </property>

    </bean>

    <!-- *************************************************************************************************  -->

    <bean id="updateNoShowAppointmentJob" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="name" value="CEPIS-UpdateNoShows" />
        <property name="group" value="Appointments" />              
        <property name="jobClass" value="edu.uky.cepis.util.cron.job.UpdateNoShowAppointmentJob" />
    </bean>


    <!-- *************************************************************************************************  --> 

    <bean id="updateNoShowTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="name" value="UpdateNoShow" />
        <property name="group" value="Appointments" />
        <property name="jobDetail" ref="updateNoShowAppointmentJob" />
        <!--  Do this every 60 seconds.-->
        <property name="cronExpression" value="0 * * * * ?" />
    </bean>



</beans>

作业:

/**
 * 
 */
package edu.uky.cepis.util.cron.job;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import edu.uky.cepis.service.AdvisingSessionService;
import edu.uky.cepis.domain.AdvisingSession;

/**
 * @author cawalk4
 * 
 * Purpose: Update all appointments with a date before the current date time
 * Setting the appointmentStatus to "No Show"
 * 
 */
public class UpdateNoShowAppointmentJob extends QuartzJobBean {

    private static Logger log = Logger.getLogger(
        UpdateNoShowAppointmentJob.class);

    private AdvisingSessionService advisingSessionService;

    private static String NO_SHOW = "No Show";

    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {

        log.debug("Running UpdateNoShowAppointmentJob at " + new Date());

        ApplicationContext appContext = null;

        try {
            appContext = (ApplicationContext) context.getScheduler()
                .getContext().get("applicationContext");
        } catch (SchedulerException se) {
            System.err.println(se);
        }

        try {
            advisingSessionService = (AdvisingSessionService) appContext
                .getBean("advisingSessionService", AdvisingSessionService.class);
        } catch (Exception e) {
            System.err.println(e);
        }
        if (advisingSessionService != null) {
            List<AdvisingSession> advisingSessionList =
                new ArrayList<AdvisingSession>(0);

            advisingSessionList = advisingSessionService.getNewNoShowAdvisingSessions();

            if (advisingSessionList == null) {
                log.debug("advisingSessionSlotlist is null.");
                return;
            } else if (advisingSessionList.isEmpty()) {
                log.debug("There are no new No Show advising appointments.");
                return;
            }

            log.debug("Total no show e-mails are: " + advisingSessionList.size());

            // Update the appointments 

            for(AdvisingSession advisingSession : advisingSessionList){

                advisingSessionService.updateAdvisingSession(                   
                        advisingSession,
                        advisingSession.getSessionType(), 
                        NO_SHOW,
                        advisingSession.getPreSessionText(), 
                        advisingSession.getSessionText(), 
                        advisingSession.getStudentNotes(), 
                        advisingSession.getAdvisorNotes(), 
                        advisingSession.getAdvisingSessionSlot(), 
                        advisingSession.getNoShowEmailSentBoolean());
            }
        } else {
            log.debug("advisingSessionService is null.");
        }
    }

    public void setadvisingSessionService(AdvisingSessionService advisingSessionService) {
        this.advisingSessionService = advisingSessionService;
    }

    public AdvisingSessionService getadvisingSessionService() {
        return advisingSessionService;
    }
}

共有1个答案

章涵容
2023-03-14

如果删除XML中设置schedulerbean的jobdetails属性的部分,那么它应该能够正常工作。

如果您查看Spring的SchedulerAccessor类(它是SchedulerFactoryBean的超类)上的SetTriggers的javadoc,您可以看到:

如果触发器确定了相应的JobDetail本身,则该作业将自动注册到排定程序中。否则,需要通过此FactoryBean的“jobDetails”属性注册相应的jobDetails。

JobDetail jobDetail = findJobDetail(trigger);
if (jobDetail != null) {
    // Automatically register the JobDetail too.
    if (!this.jobDetails.contains(jobDetail) && addJobToScheduler(jobDetail)) {
        this.jobDetails.add(jobDetail);
    }
}
 类似资料:
  • 我想知道是否有一个函数/方法来创建随机时间触发的作业。我的意思是,如果我设置一个cron计划在每周一上午10:00触发,并给出一个时间间隔,比方说30分钟,触发器将总是在9:30到10:30之间关闭。例如,这是cron调度表。

  • 问题内容: 我有一个表t,它具有一个称为trgInsAfter的“插入后”触发器。究竟该如何调试?我对此不是专家,所以问题和执行的步骤可能看起来很愚蠢。 到目前为止,我执行的步骤是:1.连接到Via (使用Windows Admin帐户) 右键单击SSMS中左侧树中的触发器节点,然后双击以将其打开,触发器的代码将在新查询窗口(称为Window-1)中打开,如下所示:blah ...., 打开另一个

  • 在使用Quartz Scheduler 1.8.6版的应用程序中,当作业未完成时,我们遇到了一个触发器卡住的问题。 例如,我们有ssh调用或数据库查询的作业。如果这些作业挂起(因为ssh调用没有终止,或者select语句有一个表锁),那么我将无法再触发这些作业。触发器被卡住,直到我强制重新启动调度程序。 我已经试过了。中断(触发器)和调度程序。重新调度触发器()。我试着移除触发器并重新创建它。我已

  • Apex触发器类似于在特定事件发生时执行的存储过程。 在记录事件发生之前和之后执行触发器。 语法 (Syntax) trigger triggerName on ObjectName (trigger_events) { Trigger_code_block } 执行触发器 以下是我们可以触发的事件 - insert update delete merge upsert undelete 触发示

  • 我们使用quartz调度器创建一个带有触发器名称和触发器组的触发器,它将在15分钟的间隔被触发。 我们希望在任何时间点手动触发时间表。因此,我们所做的就是获取与我们创建的计划相关联的作业的触发键细节,并尝试使用以下API触发作业。 用上面提到的API激发作业时(即尝试手动激发作业)的Quartz日志: 能不能有人请让我知道我们如何才能使时间表是触发与原来的工作相关联的触发器。

  • 本文向大家介绍MySQL触发器 Update触发Insert失败,包括了MySQL触发器 Update触发Insert失败的使用技巧和注意事项,需要的朋友参考一下 今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 执行触发器语句,报错,报错内容如下: 分析,由于访问工具HediSQL,导致无法正常创建触发器,相同语句,