如何将数据传递给作为MethodInvokingJobDetailFactoryBean运行的方法?

时间:2011-04-14 14:48:47

标签: java spring quartz-scheduler

我真正要做的是创建一个不同时运行的Quartz作业,但也可以访问JobExecutionContext以获取previousFireTime。这是我的目标:

// 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>

当我尝试运行它时,在使用

创建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 个答案:

答案 0 :(得分:11)

可以使用arguments属性以与弹簧MethodInvokingJobDetailFactoryBean相同的方式将参数传递给MethodInvokingFactoryBean

例如:

<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>

答案 1 :(得分:2)

MethodInvokingJobDetailFactoryBean很方便,但很原始 - 它只能执行没有参数的公共方法。

如果您的工作需要访问Quartz API,那么您需要使用JobDetailBeanQuartzJobBean代替MethodInvokingJobDetailFactoryBean。有关说明,请参阅docs。 <{1}}在运行时传递给当前QuartzJobBean

相关问题