2

これまでクォーツスケジューラを使用したことがなく、クォーツジョブの作成に問題があります。を介して構成したトリガーは起動cronExpressionせず、何が欠落しているかがわかりません。

ヘルプやアドバイスを事前に感謝します!

使ってます:

  • クォーツバージョン1.6.3

  • 春バージョン3.1.1

スケジューラー:

<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;
    }
}
4

1 に答える 1

1

BeanのjobDetailsプロパティを設定する XML の部分を削除すると、期待どおりに動作するはずです。scheduler

setTriggersSpring のSchedulerAccessorクラス (のスーパークラス)の javadoc を見ると、次のSchedulerFactoryBeanことがわかります。

Trigger が対応する JobDetail 自体を決定すると、ジョブは Scheduler に自動的に登録されます。それ以外の場合は、この FactoryBean の「jobDetails」プロパティを介して、それぞれの JobDetail を登録する必要があります。

彼らが言及していないのは、すでに を登録している場合、 が参照されたジョブをスケジュールJobDetailできないということです。のメソッドTriggerのソース コードには、次のコードのチャンクがあります。addTriggerToSchedulerSchedulerAccessor

JobDetail jobDetail = findJobDetail(trigger);
if (jobDetail != null) {
    // Automatically register the JobDetail too.
    if (!this.jobDetails.contains(jobDetail) && addJobToScheduler(jobDetail)) {
        this.jobDetails.add(jobDetail);
    }
}

jobDetailsに既にジョブが含まれている場合、if条件はすぐに失敗し、addJobToSchedulerメソッドが呼び出されることはありません。

于 2013-01-07T20:16:12.083 に答える