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

标签 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
    }
} 

抱歉奇怪的格式;这些是一些长线!

最佳答案

可以使用 arguments 属性以与 spring 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>

关于java - 如何将数据传递给作为 MethodInvokingJobDetailFactoryBean 运行的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5665053/

相关文章:

java - JSTL & Spring : Accessing methods with arguments

quartz-scheduler - 使用 Quartz.net 配置 ADOJobStore

java - 如何为每个团队成员在unix中设置java开发环境

Spring Data JPA 将原生查询结果映射到非实体 POJO

java - Quartz Scheduler突然停止运行并且没有异常错误

java - ArrayList,检查 2 个线程的大小

Java 小程序 jnlp + 库

java - 使用 javax 和 pdfbox 的静默打印机应用程序

java - Hashmap值转换错误

java - 更新现有 Gradle Libs 依赖项,以在 Spring 项目中使用 Jackson 2.8.5 和 DynamoDB 编码 ZonedDateTime