2

我一直在玩 Spring-Quartz 一段时间了,但有一件事我无法实现 - 我想使用“MethodInvokingJobDetailFactoryBean”来执行我拥有的类中的方法,我想要每次触发触发器时都会创建该对象的新实例。

我的应用程序上下文中与 Quartz 相关的部分如下所示:

  <bean id="myTask" class="com.test.TestImpl" scope="prototype" /> <!-- The bean that does the actual work -->  
<bean id="testMethodJobDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="myTask"/>
    <property name="targetMethod" value="run"/>
    <property name="concurrent" value="false"/>
</bean>
 <bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="testMethodJobDetailBean"/>
    <property name="startDelay" value="25000"/>
    <property name="repeatInterval" value="5000"/>
 </bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="waitForJobsToCompleteOnShutdown" value="true"/>
        <property name="triggers">
            <list>
                <ref bean="testTrigger"/>
            </list>

        </property>
</bean>

我的对象名称在原始文件中不同,我还有 2 个工作(每个工作都有一个触发器),但它们与我的问题无关。

上述配置有效,我的任务每 5 秒执行一次。问题是,它总是使用相同的“com.test.TestImpl”实例,这对我来说是有问题的,因为对象具有影响其行为的状态。

我读过 Quartz 的默认行为是每次都创建一个新的作业实例,但是当使用 Spring-Quartz 时,Spring 管理生命周期。这确实看起来合乎逻辑,这就是我将 scope="prototype" 添加到“myTask”bean 的原因,但它没有帮助。我还尝试将 JobDetailsFactory bean 的范围设置为原型,但没有帮助。

我认为问题在于“MethodInvokingJobDetailFactoryBean”创建的 JobDetail 对象未定义为原型,并且因为它包装了我的 bean,并且只创建了一次 - 我的 bean 不会被多次创建。

我想知道其他人是否遇到过这种情况,因为我无法找到有关此问题的任何有用信息,也无法找到遇到相同行为的任何人。当然,如果你知道如何解决这个问题,我会很高兴听到这个消息。

4

0 回答 0