Как передать данные в метод, выполняемый как MethodInvokingJobDetailFactoryBean? - PullRequest
4 голосов
/ 14 апреля 2011

Что я действительно пытаюсь сделать, так это создать задание 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 ()

Есть идеи?

Решение :

После прочтения ответа СкаффманаЯ смог заставить свое решение работать.Используя триггер, который я имел, я знал, что имя было, и понял, что группа по умолчанию была «ПО УМОЛЧАНИЮ».Мой класс расширил класс QuartzJobBean, а затем добавил этот фрагмент кода:

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

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

Извините за странное форматирование;это несколько длинных очередей!

Ответы [ 2 ]

11 голосов
/ 23 января 2012

Можно передать аргументы MethodInvokingJobDetailFactoryBean так же, как с пружиной MethodInvokingFactoryBean, используя свойство arguments.

Например:

<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>
2 голосов
/ 14 апреля 2011

MethodInvokingJobDetailFactoryBean удобен, но примитивен - он может выполнять только открытые методы без аргументов.

Если вашей работе необходим доступ к Quartz API, вам нужно будет использовать JobDetailBean и QuartzJobBean вместо MethodInvokingJobDetailFactoryBean. См. документы для получения инструкций как. QuartzJobBean передается текущему JobExecutionContext при запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...