簡體   English   中英

Spring 3 \\ Quartz2。集成問題

[英]Spring 3 \ Quartz 2. Integration problems

我在整合彈簧和石英方面遇到問題。 我需要將CronTriggerFactoryBean動態添加到SchedulerFactoryBean

XML Spring映射:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="prototype">
    <property name="jobDetails">
        <list>
            <ref bean="plannedVacationServiceJob" />
        </list>
    </property>
    <property name="triggers">
        <list>
            <ref bean="plannedVacationServiceCronTrigger" />
        </list>
    </property>
</bean>

<bean id="plannedVacationServiceJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.my.service.package.PlannerJob" />
    <property name="durability" value="true" />
</bean>

<bean id="plannedVacationServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" scope="prototype">
    <property name="jobDetail" ref="plannedVacationServiceJob" />
    <property name="cronExpression" value="*/15 * * * * ?" />
</bean>

Java代碼:

@Service
public class Planner implements Planning { 
@Autowired
@Qualifier("plannedVacationServiceCronTrigger")
private CronTriggerFactoryBean plannedVacationServiceCronTrigger;

@Autowired
private SchedulerFactoryBean schedulerFactoryBean;

 @PostConstruct
 public void init() {
       schedulerFactoryBean.start();
 } 
//some code 
private void addTask(PlannerEntity entity) {
    try {
        String name = getIdentityName(entity);
        JobKey jobKey = new JobKey(name);
        String cronExpression = getCronExpression(entity);
        plannedVacationServiceCronTrigger.setCronExpression(cronExpression);
        JobDetail jobDetail =      JobBuilder.newJob(PlannerJob.class).withIdentity(jobKey).build();
        plannedVacationServiceCronTrigger.setJobDetail(jobDetail);
        plannedVacationServiceCronTrigger.setName(name);
        plannedVacationServiceCronTrigger.afterPropertiesSet();
        schedulerFactoryBean.getScheduler().scheduleJob(jobDetail, plannedVacationServiceCronTrigger.getObject());
        triggers.put(entity.getId(), trigger);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

在這種情況下,我們只有一個觸發器,該觸發器已添加到xml映射中

我嘗試從xml刪除對觸發器的引用,並從代碼創建CronTriggerFactoryBean:

private void addTask(PlannerEntity entity) {
    try {
        String name = getIdentityName(entity);
        JobKey jobKey = new JobKey(name);
        String cronExpression = getCronExpression(entity);
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
        trigger.setCronExpression(cronExpression);
        JobDetail jobDetail = JobBuilder.newJob(PlannerJob.class).withIdentity(jobKey).build();
        trigger.setJobDetail(jobDetail);
        trigger.setName(name);
        trigger.afterPropertiesSet();
        schedulerFactoryBean.getScheduler().scheduleJob(jobDetail, trigger.getObject());
        triggers.put(entity.getId(), trigger);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但是在這種情況下,我們沒有任何觸發器:

2014-04-02 14:28:55,144 DEBUG [org.quartz.core.QuartzSchedulerThread(org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread)] - batch acquisition of 0 triggers
2014-04-02 14:29:18,981 DEBUG [org.quartz.core.QuartzSchedulerThread(org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread)] - batch acquisition of 0 triggers
2014-04-02 14:29:46,361 DEBUG [org.quartz.core.QuartzSchedulerThread(org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread)] - batch acquisition of 0 triggers
2014-04-02 14:30:09,439 DEBUG [org.quartz.core.QuartzSchedulerThread(org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread)] - batch acquisition of 0 triggers

你真的不能那樣做。 FactoryBean有一個特定的合同,您正在嘗試在其中執行。

工廠bean是旨在以編程方式創建bean的bean。 您不能真正注入工廠bean,因為它存在的唯一目的是注冊一個bean。 此外, start回調與應用程序上下文生命周期有關。 當您從代碼中調用它時,為時已晚,調度程序已處於活動狀態。

初始化bean時將注冊觸發器(在afterPropertiesSet回調方法中)。 如果在此之后嘗試向工廠添加其他觸發器,則由於已創建調度程序,因此不會將其考慮在內。

話雖如此,我真的看不到XML和Java代碼之間的關系。 在常規情況下,應該注冊您的plannedVacationServiceCronTrigger (沒有理由制作prototype bean)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM