2017-02-07 3 views
0

Я пытаюсь запланировать шаги в Spring Batch job. Я попытался использовать. Но когда я пытаюсь развернуть работу на SpringXd, это не сработает. Ниже мой код и ошибок я столкнулсяSpring Step Scheduling

<batch:job id="addB" restartable="false"> 
<batch:step id="AddB" > 
     <tasklet ref="addBTasklet" /> 
</batch:step> 
</batch:job> 

<task:scheduler id="taskScheduler" pool-size="1"/> 
     <task:scheduled-tasks scheduler="taskScheduler">   
     <task:scheduled ref="AddB" method="execute" cron="*/5 * * * * ?"/> 
</task:scheduled-tasks> 

Я получаю эту ошибку:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.springframework.scheduling.support.ScheduledMethodRunnable#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [org.springframework.scheduling.support.ScheduledMethodRunnable]:` Constructor threw exception; nested exception is java.lang.NoSuchMethodException: 
org.springframework.batch.core.step.tasklet.TaskletStep.execute() 

ответ

0

Вам нужно будет добавить класс, который реализует необходимую логику, чтобы начать работу, а затем пусть scheduler вызовет метод в этом классе. Содержание этого нового класса:

package mypackage; 

import org.springframework.batch.core.Job; 
import org.springframework.batch.core.JobExecution; 
import org.springframework.batch.core.JobParameters; 
import org.springframework.batch.core.JobParametersBuilder; 
import org.springframework.batch.core.launch.JobLauncher; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Service; 

import java.util.UUID; 

@Service 
public class TriggerScheduledJob { 

    @Autowired 
    private JobLauncher jobLauncher; 

    @Autowired 
    @Qualifier("addB") 
    private Job addBJob; 

    @Autowired 
    @Qualifier("addC") 
    private Job addCJob; 

    public void triggerAddB() { 
     JobParameters param = new JobParametersBuilder().addString("id", UUID.randomUUID().toString()).toJobParameters(); 
     try { 
      JobExecution execution = jobLauncher.run(addBJob, param); 
      System.out.println("Job executed with exit status = " + execution.getStatus()); 
     } catch (Exception e) { 
      System.out.println("Failed to execute job. " + e.getMessage()); 
     } 
    } 

    public void triggerAddC() { 
     JobParameters param = new JobParametersBuilder().addString("id", UUID.randomUUID().toString()).toJobParameters(); 
     try { 
      JobExecution execution = jobLauncher.run(addCJob, param); 
      System.out.println("Job addC executed with exit status = " + execution.getStatus()); 
     } catch (Exception e) { 
      System.out.println("Failed to execute job. " + e.getMessage()); 
     } 
    } 
} 

Затем настроить свой контекст Spring приложения так, что он создает этот новый компонент, и модифицировать планировщик вызвать соответствующий метод этого боба, чтобы вызвать фактическую работу, которую вы хотите начать:

<batch:job id="addB" restartable="false"> 
    <batch:step id="AddB" > 
     <tasklet ref="addBTasklet" /> 
    </batch:step> 
</batch:job> 

<batch:job id="addC" restartable="false"> 
    <batch:step id="AddC" > 
     <tasklet ref="addCTasklet" /> 
    </batch:step> 
</batch:job> 

<bean id="triggerScheduledJob" class="mypackage.TriggerScheduledJob" /> 

<task:scheduler id="taskScheduler" pool-size="1"/> 
<task:scheduled-tasks scheduler="taskScheduler">   
    <task:scheduled ref="triggerScheduledJob" method="triggerAddB" cron="*/5 * * * * ?"/> 
</task:scheduled-tasks> 
<task:scheduled-tasks scheduler="taskScheduler">   
    <task:scheduled ref="triggerScheduledJob" method="triggerAddC" cron="*/5 * * * * ?"/> 
</task:scheduled-tasks> 

Надеюсь, что это приведет вас вперед.

+0

Что делать, если у нас есть два шага «addB» и «addC», и оба должны планироваться для запуска с разными выражениями cron. – srikar

+0

Или, чтобы сделать его простым, у меня есть BeanA, BeanB, BeanC, BeanD, и каждый из них должен быть запланирован в определенное время. – srikar

+0

Привет. Я продлил ответ, чтобы включить ситуацию для запуска двух разных заданий с двумя разными cron-выражениями. Надеюсь, поможет. – aksamit