0

我遇到了一个问题,我有两个类扩展QuartzJobBean. 我面临的问题是创建两个SchedulerFactoryBean. 我进行了研究,发现设置属性schedulerName可以解决问题。这对我不起作用。我@Qualifier也用过。如果我创建 的两个 bean SchedulerFactoryBean,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错误基本上是当两者都SchedulerFactoryBean被定义时,spring没有找到唯一的bean 。基本上如何SchedulerFactoryBean为完全隔离的类配置多个..?

4

1 回答 1

0

请您解释一下为什么需要两个 scheduarfactorybean。根据 spring 文档,FactoryBean 创建和配置 Quartz 调度程序,将其生命周期作为 Spring 应用程序上下文的一部分进行管理,并将调度程序公开为依赖注入的 bean 引用。

这意味着您不能拥有 bean 的多个实例。

此外,根据您的代码,您正在尝试安排多个作业,这些作业可以使用一个 schedularFactoryBean 完成。创建多个作业 bean 及其相应的触发器,并将它们作为列表添加到调度 factoryBean。无论是 cron 触发器还是简单触发器,都将根据配置调用所有触发器。

于 2013-09-13T10:19:35.020 回答