我真正要做的是创建一个不同时运行的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
}
}
抱歉奇怪的格式化;这些是长篇大论!
答案 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,那么您需要使用JobDetailBean
和QuartzJobBean
代替MethodInvokingJobDetailFactoryBean
。有关说明,请参阅docs。 <{1}}在运行时传递给当前QuartzJobBean
。