Spring BatchでMySQLを使用する

1年近く前くらいにSpring Batchを検証して↓とか書いたりしたのですが、
SpringBatchで複数ファイルをマルチスレッドでDBに突っ込む | shinodogg.com
結局ヘビー過ぎて導入は見送りました。
 
が、ぼちぼちそういうタイミングになってきたので、再度チャレンジ中です。
 
今回、RDBMSはMySQLを使用するわけですが、いきなりつまずきます、とw
 
■ Maven
Maven使うとこの辺は本当にお手軽でナイスです。

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.6</version>
</dependency>

 
■ batch.properties
driverとurlを書きえます。

batch.jdbc.driver=com.mysql.jdbc.Driver
batch.jdbc.url=jdbc:mysql://localhost/hoge
batch.jdbc.user=root
batch.jdbc.password=
batch.schema=
batch.schema.script=classpath:/org/springframework/batch/core/schema-hsqldb.sql

 
■ ジョブ実行
STSでSpringBatchプロジェクト作ると、サンプルが入っているので、
Run ConfigurationsでProgram argumentsに
launch-context.xmlとjob1を渡して実行します。
ログを追っていくと、、なんかMySQL系で落ちました、と。

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near 'IDENTITY NOT NULL PRIMARY KEY,
VERSION BIGINT, JOB_NAME VARCHAR(100) NOT' at line 1

 
■ ジョブ管理系テーブル
SpringBatchは公式サイトの Chapter 3. The Domain Language of Batch に
書いてあるように、ジョブとかステップとかパラメータとか諸々を管理するのにRDBMSを使います。
そのテーブルに関するDDLは、spring-batch-core-x.x.x.RELEASE.jar の中に
入っているわけですが、ログみると hsqld.sql って書いてあります。

INFO [org.springframework.batch.core.repository.support.JobRepositoryFactoryBean] -
<No database type set, using meta data indicating: MYSQL>
INFO [org.springframework.jdbc.datasource.init.ResourceDatabasePopulator] -
<Executing SQL script from class path resource
[org/springframework/batch/core/schema-hsqldb.sql]> 

これ、どこで指定してるかっていうと、上記のbatch.propertiesで、
↓ですよね~っていう。
batch.schema.script=classpath:/org/springframework/batch/core/schema-hsqldb.sql
 
中身みていくと、CREATE TABLEするときに、自動採番の『IDENTITY』ってのが
MySQLには無いよんってことみたいです。
 
schema-mysql.sqlをみると、MYISAM使ってなんかタルい事になってます。
#そういえば前の別プロジェクトの一意な値が欲しくて時もこんな事やったな。。

CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0);
CREATE TABLE BATCH_JOB_EXECUTION_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0);
CREATE TABLE BATCH_JOB_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
INSERT INTO BATCH_JOB_SEQ values(0);

 
ちなみにOracleだとシーケンスオブジェクトで対応してます。

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE;

 
BIGINTとかNUMBERのデカい値で扱ってNOCYCLEってのは、
なんというかエンタープライズなカホリがするような気がします。
 
この辺、後でソース追ってみたら面白いっていうか、インタフェースは
揃ってて、ちゃんと部品化されてるでしょ?って新卒君とかに教えるのに
良いネタだったりするかも知れませんね。
 
■ batch.properties書き換えて再実行
↓のようにschema-mysql.propertiesに書き換えて、
batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql

INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - <Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5a5e5a50: startup date [Fri Sep 16 11:16:02 JST 2011]; root of context hierarchy>
INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - <Loading XML bean definitions from class path resource [launch-context.xml]>
INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - <Loading XML bean definitions from class path resource [META-INF/spring/module-context.xml]>
~略~
INFO [org.springframework.batch.core.launch.support.SimpleJobLauncher] - <Job: [FlowJob: [name=job1]] completed with the following parameters: [{}] and the following status: [COMPLETED]>
INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - <Closing org.springframework.context.support.ClassPathXmlApplicationContext@5a5e5a50: startup date [Fri Sep 16 11:16:02 JST 2011]; root of context hierarchy>
INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - <Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1c701a27: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,exampleConfiguration,reader,writer,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.jdbc.datasource.init.DataSourceInitializer#0,org.springframework.batch.core.scope.internalStepScope,org.springframework.beans.factory.config.CustomEditorConfigurer,org.springframework.batch.core.configuration.xml.CoreNamespacePostProcessor,jobRepository,step1,job1,step2,jobFromMqToMySQL,dataSource,jobLauncher,transactionManager]; root of factory hierarchy>

無事に動いたみたいです。

mysql> show tables;
+------------------------------+
| Tables_in_hogehoge           |
+------------------------------+
| batch_job_execution          |
| batch_job_execution_context  |
| batch_job_execution_seq      |
| batch_job_instance           |
| batch_job_params             |
| batch_job_seq                |
| batch_step_execution         |
| batch_step_execution_context |
| batch_step_execution_seq     |
| hoge                         |
+------------------------------+
10 rows in set (0.00 sec)
mysql> select * from batch_job_execution;
+------------------+---------+-----------------+---------------------+---------------------+---------------------+-----------+-----------+--------------+------------
---------+
| JOB_EXECUTION_ID | VERSION | JOB_INSTANCE_ID | CREATE_TIME         | START_TIME          | END_TIME            | STATUS    | EXIT_CODE | EXIT_MESSAGE | LAST_UPDATE
D        |
+------------------+---------+-----------------+---------------------+---------------------+---------------------+-----------+-----------+--------------+------------
---------+
|                1 |       2 |               1 | 2011-09-16 11:16:03 | 2011-09-16 11:16:03 | 2011-09-16 11:16:03 | COMPLETED | COMPLETED |              | 2011-09-16
11:16:03 |
+------------------+---------+-----------------+---------------------+---------------------+---------------------+-----------+-----------+--------------+------------
---------+
1 row in set (0.00 sec)

 
 

Spring Batchやってるとこういう事の連続なんですよねぇ。
設定とか、概念とか、覚えなきゃいけない事が多いから、
英語のドキュメント見て、ソース見て、あーそかそか、みたいな。
 

Androidアプリケーション技術者認定試験 ベーシック対策実践問題集
Androidアプリケーション技術者認定試験対策委員会
日経BP社
売り上げランキング: 89772

コメント

タイトルとURLをコピーしました