我已经在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的默认行为是每次创建一个新的Job实例,但是当使用Spring-Quartz时,Spring会管理生命周期。这确实看起来合乎逻辑,这就是为什么我在“ myTask” bean中添加了scope =“ prototype”的原因,但这没有帮助。
我还尝试将JobDetailsFactory bean的范围设置为原型,但这没有帮助。
我认为问题在于“ MethodInvokingJobDetailFactoryBean”创建的JobDetail对象未定义为原型,并且因为它包装了我的bean,并且仅创建了一次-我的bean不会被创建多次。
我想知道是否有人遇到了此问题,因为我找不到有关此问题的任何有用信息,也找不到任何经历相同行为的人。
当然,如果您知道如何解决此问题,我将很高兴听到它。
最佳答案
真是太有趣了:)我来这里是为了找到一种解决方案,该解决方案在执行之前避免使用石英创建实例。
您可以尝试QuartzJobBean方法,其行为与石英的默认行为相同
关于java - 如何在Spring-Quartz中使用“MethodInvokingJobDetailFactoryBean”创建“targetObject”的原型(prototype)实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11938636/