我遇到了一个问题,我有两个类QuartzJobBean
。我面临的问题是创建两个SchedulerFactoryBean
。我做了我的研究,发现设置属性schedulerName
解决了问题。这不适合我。我也使用了@Qualifier
。如果我创建SchedulerFactoryBean
的两个bean,Spring不知道要引用哪个调度程序。我有两个CronTriggers。
代码:
<!--
<bean name="quartzSchedulerR" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.task.QuartzScheduler" />
<property name="jobDataAsMap">
<map>
<entry key="rRSImpl" value-ref="rRSService" />
<entry key="SRObject" value-ref="SRObject"/>
</map>
</property>
</bean>
<bean id="cronTriggerR"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="quartzSchedulerR" />
<property name="cronExpression" value="0 30 12 ? * MON *" />
</bean>
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="schedulerName" value="scheduleOne"/>
<property name="schedulerContextAsMap">
<map>
<entry key="rSchedulerServiceImpl" value-ref="rSchedulerServiceImpl"></entry>
</map>
</property>
<property name="jobDetails">
<list>
<ref bean="quartzSchedulerR" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTriggerR" />
</list>
</property>
</bean> -->
<bean id ="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="schedulerContextAsMap">
<map>
<entry key="rSSImpl" value-ref="rSSImpl"></entry>
</map>
</property>
</bean>
<bean id="jobDetailFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName">
<idref local="jobDetail" />
</property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean" scope="prototype">
<property name="jobClass" value="com.scheduler.SMTPMailJob " />
<property name="jobDataAsMap">
<map>
<entry key="rSSeImpl" value-ref="rSSImpl" />
<entry key="fUtil" value-ref="fUtil" />
<entry key="rService" value-ref="rService" />
<entry key="fusion" value-ref="fusion"/>
<entry key="fcproperties" value-ref="fcproperties"/>
</map>
</property>
</bean>
<bean id="jobTriggerFactory"
class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName">
<idref local="jobTrigger" />
</property>
</bean>
<bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"
scope="prototype">
</bean>
目前我注释掉第一个调度程序,应用程序按预期工作。但如果我取消注释,第二个调度程序将停止工作。这个问题的任何解决方法..?任何帮助表示赞赏。
编辑:没有错误,但我知道作业未安排。错误基本上是当com.quartz.Scheduler
都被定义时,spring没有为SchedulerFactoryBean
找到唯一的bean。基本上如何为完全隔离的类配置多个SchedulerFactoryBean
..?
答案 0 :(得分:1)
请你解释为什么你需要两个schedulebefactorybeans。 根据spring doc,FactoryBean创建和配置Quartz Scheduler,将其生命周期作为Spring应用程序上下文的一部分进行管理,并将Scheduler公开为依赖注入的bean引用。
这意味着您无法拥有该bean的多个实例。
另外,根据您的代码,您尝试安排多个可以使用一个schedularFactoryBean完成的作业。创建多个作业bean及其相应的触发器,并将它们作为列表添加到日程表factoryBean中。无论是cron触发器还是简单触发器,都将根据配置调用所有触发器。