2011-04-14 36 views
4

我真正想要做的是創建一個不同時運行的Quartz作業,但也可以訪問JobExecutionContext以獲得previousFireTime。這是我的目標:如何將數據作爲MethodInvokingJobDetailFactoryBean傳遞給正在運行的方法?

// imports... 

public class UtilityObject { 

    private SomeService someService; 

    @Autowired 
    public UtilityObject(SomeService someService) { 
     this.someService = someService; 
    } 

    public void execute(JobExecutionContext ctx) throws JobExecutionException { 
     Date prevDate = ctx.getPreviousFireTime(); 

     // rest of the code... 
    } 
} 

這裏是我如何配置我的豆:與

創建Bean的過程中

<bean name="utilityBean" class="UtilityObject" /> 

<bean id="utilityJob" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetOjbect" ref="utilityBean" /> 
    <property name="targetMethod" value="execute" /> 
    <property name="concurrent" value="false" /> 
</bean> 

<bean name="utilityTrigger" 
    class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="utilityJob" /> 
    <property name="startDelay" value="5000" /> 
    <property name="repeatInterval" value="20000" /> 
</bean> 

當我嘗試運行它,它失敗NoSuchMethodException:UtilityJob.execute()

任何想法?

解決方案

閱讀skaffman的答案後,我能得到我的解決辦法工作。使用我擁有的觸發器,我知道這個名字是,並且發現默認組是'DEFAULT'。我有我的類擴展QuartzJobBean類,然後添加這段代碼:

protected void executeInternal(JobExecutionContext ctx) 
       throws JobExecutionException { 
    boolean isRunning = 
      (ctx.getScheduler().getTriggerState("utilityTrigger", "DEFAULT") == 
       Trigger.STATE_BLOCKED); 

    if (isRunning) { 
     // run the job 
    } 
} 

對不起,我奇怪的格式;這些是很長的路線!

回答

2

MethodInvokingJobDetailFactoryBean很方便,但很簡單 - 它只能執行沒有參數的公共方法。

如果您的工作需要訪問Quartz API,那麼您需要使用JobDetailBeanQuartzJobBean而不是MethodInvokingJobDetailFactoryBean。有關說明,請參閱docs。運行時QuartzJobBean已通過當前JobExecutionContext

+1

感謝。我正在修改我的問題,以包括我在閱讀您的答案後最終達成的答案。 – Pat 2011-04-14 19:36:07

10

可以像使用參數屬性彈簧MethodInvokingFactoryBean一樣將參數傳遞給MethodInvokingJobDetailFactoryBean

例如:

<bean id="myJob" 
     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject" ref="myBean" /> 
    <property name="targetMethod" value="myMethod" /> 
    <property name="arguments"> 
     <list> 
      <value>greetings</value> 
      <ref bean="anotherBean"/> 
     </list> 
    </property> 
</bean> 
相關問題