我一直在玩 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 不会被多次创建。
我想知道其他人是否遇到过这种情况,因为我无法找到有关此问题的任何有用信息,也无法找到遇到相同行为的任何人。当然,如果你知道如何解决这个问题,我会很高兴听到这个消息。