2017-02-07 8 views
0

スプリングバッチジョブでステップをスケジューリングしようとしています。私は使ってみました。しかし、私がSpringXdにそのジョブをデプロイしようとしているとき、失敗しています。以下は、私はこのエラーを取得していますスプリングステップスケジューリング

<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

あなたが仕事を開始してみましょうするために必要なロジックを実装するクラスを追加する必要がありますスケジューラはそのクラスのメソッドを呼び出します。この新しいクラスの内容:

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()); 
     } 
    } 
} 

そして、それはこの新しいBeanを作成するようにSpringアプリケーションのコンテキストを調整し、あなたが開始する実際のジョブを起動するためにそのBeanの関連するメソッドを呼び出すためのスケジューラを変更します。

<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」の2つのステップがあり、両方とも異なるcron式で実行するようにスケジュールする必要がある場合はどうすればよいですか。 – srikar

+0

それを簡単にするために、私はBeanA、BeanB、BeanC、BeanDを持っていて、それぞれ特定の時間にスケジュールする必要があります。 – srikar

+0

こんにちは。私は、2つの異なるcron表現を持つ2つの異なるジョブを起動する状況を含めるように答えを拡張しました。それが役に立てば幸い。 – aksamit