Проблема интеграции кварца с пружинным замком - PullRequest
2 голосов
/ 13 августа 2011

Я пытаюсь использовать весеннюю партию и кварц в проекте.Цель состоит в том, чтобы запланировать весенне-пакетное задание, используя Кварц.У меня есть следующие bean-компоненты -

bean id="updateDataFeedJob"  class="package.UpdateDataFeedJob" />     

<bean id="UpdaterOnScheduleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="updateDataFeedJob"/>
    <!-- the method to call inside of com.siemens.scr.schedule.UpdateDataFeedJob -->
    <property name="targetMethod" value="execute"/>
</bean> 

<bean id="cronTriggerId" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="UpdaterOnScheduleJobDetail" />
    <!-- run every morning at 3AM -->
    <!--  <property name="cronExpression" value="0 0 3 * * ?" /> -->

    <!-- Fires every five minutes -->
    <property name="cronExpression" value="0 0/5 * * * ?" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTriggerId" />
        </list>
    </property>
</bean>

UpdateDataFeedJob - -

public class UpdateDataFeedJob  {   
  public void execute() throws Exception {
    System.out.println("Hello World. Running the job");
    CommandLineJobRunner.main(new String[]{"GetFleetUpdatesJob.xml", "getFleetUpdatesJob"});
  }  
}

Пример вызова - -

public class Client {
    public static void main(String[] args){
        //CommandLineJobRunner.main(new String[]{"GetFleetUpdatesJob.xml", "getFleetUpdatesJob"});
        new ClassPathXmlApplicationContext("GetFleetUpdatesJob.xml");
    }   
}

Я получаю следующее исключение -

ERROR - Job Terminated in error: A job execution for this job is already running: JobInstance: id=0, JobParameters=[{}], Job=[getFleetUpdatesJob]
org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobInstance: id=0, JobParameters=[{}], Job=[getFleetUpdatesJob]
    at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:112)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:98)
    at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:291)
    at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:448)
    at com.siemens.scr.schedule.UpdateDataFeedJob.execute(UpdateDataFeedJob.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:276)
    at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:260)
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)

Ответы [ 3 ]

1 голос
/ 24 октября 2011

Spring batch различает разные исполнения одного и того же задания с помощью предоставленных параметров Job.

Как видно из примера кода, вы не передаете параметры задания, следовательно, все исполнения задания будут одинаковыми в зависимости от Spring Batch.и любой экземпляр, который застрял в рабочем состоянии, заставит весеннюю партию генерировать исключение JobAlreadyRunningException.

1 голос
/ 15 августа 2011

Я получил это работает. Я не знаю точную причину и буду признателен, если кто-то может прокомментировать -

Я добавил следующую конфигурацию bean-компонента в applicationContext.xml

<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>

Теперь я не получаю это исключение, и кварц может вызывать весеннее пакетное задание

0 голосов
/ 24 мая 2012

У нас была такая же проблема.Мы беспокоились, что кто-то может затянуть кварцевое окно, а у кварца нет ScheduleExector.scheduleAtFixedDelay.Он имеет только shceduleAtFixedRate, поэтому пакетные задания «могли» перекрываться, поэтому мы:

  1. добавляем параметры задания, чтобы сделать задание уникальным
  2. , помещаем статическую переменную в наш кварцевый триггер Java,имеет поле isRunning, поэтому мы не позволяем заданию запускать два экземпляра в одной JVM на случай, если период будет слишком узким.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...