ラベル batch の投稿を表示しています。 すべての投稿を表示
ラベル batch の投稿を表示しています。 すべての投稿を表示

2014年5月15日木曜日

Spring Batch Adminにスケジュール機能をつけてみる

前回、Spring Batch Adminについて触れましたが、
Springには 3.0からTaskSchedulerという機能がついているのでそれを使って
Spring Batch Adminにスケジュールをホストさせてみます。


あくまで、Spring Batch Adminの使っているtaskLauncherを
TaskSchedulerから使うというものでAdminからスケジュールを編集できるとかではありません。
あしからず。


RunScheduler.java :

@Component
public class RunScheduler {

   
    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private ListableJobLocator jobLocator;

    private String jobName;
   
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public void run() {

        try {

            String dateParam = new Date().toString();
            JobParameters param = new JobParametersBuilder().addString("date",
                    dateParam).toJobParameters();

            System.out.println(dateParam);

            Job job = jobLocator.getJob(jobName);

            JobExecution execution = jobLauncher.run(job, param);

        } catch (Exception e) {


 e.printStackTrace();
        }

    }
}




bean定義に次のようにスケジュールを定義します。
下の例では、テンプレートにあるsimpleJobを5分毎に実行します。

  <bean id="runScheduler" class="my.package.RunScheduler">
      <property name="jobName" value="simpleJob"/>
  </bean>
 
  <!-- Run every 5 minutes     -->
  <task:scheduled-tasks>
    <task:scheduled ref="runScheduler" method="run" cron="0 */5 * * * *" />
   </task:scheduled-tasks>




cronの記述方法については下記
http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06



記事を書いていて気づいた、
このscheduler自体をJob化すればadminからスケジュールの開始、停止もできる

Spring Batch AdminのMySQL設定

バッチ実行にSpring Batchを利用しようかと検討しています。

jBatchがJavaEEに組み込まれたこともあり、
それに準拠した形でバッチを作ったほうがなにかと恩恵があるのかなと思ったというだけですが。

で、Spring BatchにはSpring Batch AdminというWebUIがあるので
使ってみます。あくまで、実行、停止、実行履歴が見れる程度のものです。
標準のdatabaseがhsqldbとなっているのでMySQLに変更します。

Adminのテンプレートでは
META-INF/batch-hsql.properties
というファイルがあるので次のファイルに変更します。


META-INF/batch-mysql.properties:



batch.jdbc.driver=com.mysql.jdbc.Driver
batch.jdbc.url=jdbc:mysql://localhost/test
batch.jdbc.user=user

batch.jdbc.password=
batch.jdbc.testWhileIdle=true
batch.jdbc.validationQuery=SELECT 1
batch.jdbc.maxActive=70
batch.jdbc.initialSize=20
batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql
batch.drop.script=classpath*:/org/springframework/batch/core/schema-drop-mysql.sql
batch.business.schema.script=classpath:/business-schema-mysql.sql
batch.database.incrementer.class=org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer

# Non-platform dependent settings that you might like to change
batch.data.source.init=false




batch.data.source.init=falseはdatabase初期化するかという設定です。
一番最初に起動するときのみtrueにする必要があります。

このままだと、遅いので dataSourceをoverrideします。
次のファイルを作成します。


META-INF/spring/batch/override/war-content.xml :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/batch
        http://www.springframework.org/schema/batch/spring-batch-2.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">


<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource”>
          <property name=”driverClassName” value=”${batch.jdbc.driver}” />
          <property name=”url” value=”${batch.jdbc.url}” />
          <property name=”username” value=”${batch.jdbc.user}” />
          <property name=”password” value=”${batch.jdbc.password}” />

          <property name=”initialSize” value=”${batch.jdbc.initialSize}”/>
          <property name=”maxActive” value=”${batch.jdbc.maxActive}”/>

</bean>
</beans>




実行時に引数を渡す必要があります。
 -DENVIRONMENT=mysql

なのでmaven でデバッグするときは 次のようになる
jetty:run  -Dmaven.surefire.debug test -DENVIRONMENT=mysql



せっかくなのでスケジュールに機能もつけてみました→