2012-08-13 67 views
2

我一直在玩弄春石英有一段时间了,有一件事我无法做到 - 我想用“MethodInvokingJobDetailFactoryBean中”,以便在I类必须执行的方法,以及我希望每次触发触发器时创建该对象的新实例。如何使用Spring-Quartz中的“MethodInvokingJobDetailFactoryBean”创建“targetObject”的原型实例?

是关系到石英我的应用程序上下文的部分看起来像这样:

<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石英时,春季管理的生命周期。这确实是合乎逻辑的,这就是为什么我将范围=“原型”添加到“myTask”bean,但它没有帮助。 我也尝试将JobDetailsFactory bean的范围设置为原型,并没有帮助。

我觉得现在的问题是,通过“MethodInvokingJobDetailFactoryBean中”创建的JobDetail对象没有被定义为原型,因为它是我的包裹豆,并创建只有一次 - 我的豆将不会创建超过一次。

我想知道,如果别人遇到了这个,因为我没能找到有关此问题的任何有用的信息,而无法找到任何人都经历了同样的行为。 当然,如果你知道如何解决这个问题,我会很乐意听到它。

+0

你摸不着头脑?我有同样的问题。 – badgerduke 2012-12-13 18:27:17

回答

0

这是很有趣的:)我来到这里发现,避免了石英执行前创建实例的解决方案。

你可以尝试QuartzJobBean方式,它具有与石英的默认行为相同的行为

相关问题