質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

spring batchを実行させるタイミングを変えたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,526

takuChiba

score 7

前提・実現したいこと

Spring Batchのjobをブラウザ上のリンクを押した時に実行させたいです。

発生している問題・エラーメッセージ

プログラムを実行した際にjobも一緒に実行されてしまい、
リンクを押下した時のみ実行されるように試行錯誤しています。

該当のソースコード

package jp.co.sample.sampleTraining;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.stereotype.Controller;

@Configuration
@EnableBatchProcessing
//ここに実験的に@Controller, @RequestMapping をつけたものの実行のタイミングは変わりませんでした。
public class SampleBatchApplication {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Bean(name = "job1")//beanアノテーションにname属性を追加しました。※修正後追記
    public Job job(JobBuilderFactory jobs, Step s) {
        return jobs
                .get("myJob")
                .incrementer(new RunIdIncrementer())
                .start(s)
                .build();
    }

    @Bean(name = "s")
    public Step step() {
        return steps.get("step").tasklet((stepContribution, chunkContext) -> {
       System.out.println("実行の確認");
            return RepeatStatus.FINISHED;
        }).build();
    }
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
        <div>
        <!-- spring batchを起動させたいリンク -->
          <a class="btn btn-default" href="/download/csvDownload">
                    <i class="fa fa-plus-square-o"></i>CSV Download</a>
                </div>
</body>
</html>
//コントローラー加筆※修正後追加
package jp.co.sample.sampleTraining.web.download;

import java.util.HashMap;
import java.util.Map;

import javax.batch.operations.JobRestartException;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/download")
public class DownloadController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job1;

    @RequestMapping("/csvDownload")
    public String csvDownload()
            throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException,
            JobParametersInvalidException, org.springframework.batch.core.repository.JobRestartException {
        jobLauncher.run(job1, createInitialJobParameterMap());
        return "/item/downloadPage";
    }

    private JobParameters createInitialJobParameterMap() {
        Map<String, JobParameter> m = new HashMap<>();
        m.put("time", new JobParameter(System.currentTimeMillis()));
        JobParameters p = new JobParameters(m);
        return p;
    }

}

試したこと

ネットで調べたのですが、中々それらしい記事は見つかりませんでした。
spring batchを使用するのは初めてだったので、見当がつきません。

<以降追記部分>
違うだろうなと思いつつアノテーション(@RequestMapping)などをつけてみたりしていました。
あとは何かspring batchに実行条件を変える設定等があるのではないかと考え調べています。

<以降解決後追記>
まず、jobのbeanアノテーションにnameをつけました。
そしてリンクに飛ぶようrequestmappingアノテーションをつけたcontrollerクラスの
メソッドにjobLuncherクラスのrunメソッドを作成し、第一引数にjobのbeanアノテーションにつけた
nameを入れたところ、実行タイミングを変える事が出来ました。
念のため修正後のコードも記載しておきます。

補足情報(言語/FW/ツール等のバージョンなど)

java/spring mvc/sts

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/01/19 12:47

    コピペ(http://kagamihoge.hatenablog.com/entry/2015/02/14/144238)したコードの起動タイミングを変更したいというのは丸投げ(非推奨)以外の何でもありませんよ

    キャンセル

回答 1

checkベストアンサー

0

参考URL
上記の参考URLのページで、「ジョブを非同期で実行する方法」「プログラム上からジョブを実行する方法」を参考にしてやりたいことは実現できないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/24 18:24

    おお、できましたか。良かったです。

    キャンセル

  • 2018/01/24 18:40

    解決したのでしたら、クローズしてくださいね。できればどう解決したのかを記述していただけると似たような問題で悩んでる人の解になると思います。

    キャンセル

  • 2018/01/25 15:56

    色々とありがとう御座います。
    本当に助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る