เขียน Spring Batch เบื้องต้นโดยใช้ Maven

ได้รับมอบหมายให้ศึกษา Spring Batch โดยใช้ Maven เป็นตัวควบคุมโปรเจค ก็เลยเขียนบันทึกไว้ให้คนที่กำลังงมอยู่ช่วยให้เริ่มต้นกับ Spring Batch ได้ง่ายขึ้น โดยมีข้อแม้ว่า ท่านต้อง Setup Maven ให้สามารถรันได้ก่อนนะครับ ส่วนท่านที่ไม่ได้ใช้ Maven ในการทำงาน อาจจะติดขัดบ้างนะครับ ให้ดูว่าต้องยุ่งกับไฟล์หรือโฟลเดอร์อะไรบ้าง ที่เหลือก็แค่หาคำสั่ง Run แบบ Command Line ได้ก็เริ่มต้นได้หล่ะ
ผมค้น Google แล้วเจอกับ http://numberformat.wordpress.com/2010/02/05/hello-world-with-spring-batch/ เลยลองทำตามแล้วได้ผล จริงเอามาเขียนเป็นวิธีของตัวเองบ้าง ส่วน Environment ที่ผมใช้ ผมเขียนบน Windows นะครับ

  1. สร้างโฟลเดอร์ที่เก็บโปรเจคขึ้นมา จากนั้นเปิดหน้าต่าง Command Line ขึ้นมาแล้วชี้ไปที่โฟลเดอร์ที่เพิ่งสร้าง จากนั้นพิมพ์คำสั่ง

    mvn archetype:generate -DarchetypeArtifactId=maven -archetype-quickstart -DgroupId=com.test -DartifactId=springBatchHelloWorld

    ถ้าขึ้นคำถามก็ให้กด Enter ไปเรื่อยๆ จนสร้าง Maven Project เสร็จ

  2. ชี้ Command Line เข้าไปในโฟลเดอร์โปรเจคที่เพิ่งสร้างโดย Maven ซึ่งมีโฟลเดอร์เดียว ณ ตำแหน่งปัจจุบัน ซึ่งได้จากขั้นตอนก่อนหน้านี้ แล้วสร้างโฟลเดอร์ resources โดยพิมพ์คำสั่งใน Command Line ว่า

    md src\main\resources

  3. แก้ไข pom.xml ให้เป็นดังนี้ (อยู่ที่โฟลเดอร์ตำแหน่งปัจจุบัน ก็อปไปทับเลย)
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.test</groupId>
      <artifactId>springBatchHelloWorld</artifactId>
      <packaging>jar</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>springBatchHelloWorld</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
    
            <dependency>
                <groupId>org.springframework.batch</groupId>
                <artifactId>spring-batch-core</artifactId>
                <version>2.0.4.RELEASE</version>
            </dependency>
     	<dependency>
    		<groupId>commons-lang</groupId>
    		<artifactId>commons-lang</artifactId>
    		<version>2.1</version>
    	</dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
                <version>2.5.6</version>
            </dependency>
    
      </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.0.2</version>
                    <configuration>
                        <source>1.5</source>
                        <target>1.5</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    
  4. สร้างไฟล์ชื่อว่า applicationContext.xml ไว้ที่ src/main/resources/ (เป็น config ของ Spring Core) แล้วก็อป xml ข้างล่างนี้ไปวาง
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/batch"
    	xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="
    
    http://www.springframework.org/schema/beans
    
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    
    http://www.springframework.org/schema/batch
    
    http://www.springframework.org/schema/batch/spring-batch-2.0.xsd">
    
    <beans:bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <beans:property name="transactionManager" ref="transactionManager"/>
    </beans:bean>
    
    	<beans:bean id="jobLauncher"
    		class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    		<beans:property name="jobRepository" ref="jobRepository" />
    	</beans:bean>
    
    	<beans:bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
    </beans:beans>
    

    ไฟล์นี้เป็นของ Spring Core ที่ใช้ในการทำงาน ส่วนเนื้อหาที่เราจะก็อปไปนี้ เป็น config ที่แจ้งให้ Spring Core ทราบ ถ้าต้องมีการใช้งาน Spring Batch

  5. สร้างไฟล์ jobs.xml ไว้ที่ src/main/resources/ (ต้นฉบับเขาใช้ simpleJob.xml แต่ผมจะเอาไปใช้งานต่อ เลยตั้งชื่อให้ดูเป็นทางการ) แล้วก็อป xml ข้างล่างนี้ไปวาง
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/batch"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
    
    http://www.springframework.org/schema/beans
    
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    
    http://www.springframework.org/schema/batch
    
    http://www.springframework.org/schema/batch/spring-batch-2.0.xsd">
    
        <beans:import resource="applicationContext.xml"/>
    
    <job id="helloWorldJob" job-repository="jobRepository">
    	<step id="step1">
    		<tasklet ref="helloWorldTasklet" />
    	</step>
    </job>
    
    <beans:bean name="helloWorldTasklet" class="com.test.HelloWorldTasklet"/>
    
    <!--
    To run the job from the command line type the following:
    mvn exec:java -Dexec.mainClass=org.springframework.batch.core.launch.support.CommandLineJobRunner -Dexec.args="jobs.xml helloWorldJob"
     -->
    </beans:beans>
    
    

    ไฟล์นี้เอาไว้ให้ Spring Batch ใช้งาน โดยจะเก็บ Task ที่ใช้งานทั้งหมดไว้ที่นี่

  6. สร้าง Tasklet ซึ่งเป็นจาวาคลาสเพื่อให้ Spring Batch เอาไปทำงาน
    package com.test;
    
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.scope.context.ChunkContext;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
    
    public class HelloWorldTasklet implements Tasklet {
    
    	public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
    			throws Exception {
    		System.out.println("");
    		System.out.println(" XXX XXX           XX      XX             ");
    		System.out.println("  X   X             X       X             ");
    		System.out.println("  X   X             X       X             ");
    		System.out.println("  X   X   XXXXX     X       X     XXXXX   ");
    		System.out.println("  XXXXX  X     X    X       X    X     X  ");
    		System.out.println("  X   X  XXXXXXX    X       X    X     X  ");
    		System.out.println("  X   X  X          X       X    X     X  ");
    		System.out.println("  X   X  X     X    X       X    X     X  ");
    		System.out.println(" XXX XXX  XXXXX   XXXXX   XXXXX   XXXXX   ");
    		System.out.println("                                          ");
    		System.out.println("                                          ");
    		System.out.println("                                          ");
    		System.out.println("                                          ");
    		System.out.println(" XXX XXX                   XX        XX   ");
    		System.out.println("  X   X                     X         X   ");
    		System.out.println("  X   X                     X         X   ");
    		System.out.println("  X   X   XXXXX  XXX XX     X     XXXXX   ");
    		System.out.println("  X X X  X     X   XX  X    X    X    X   ");
    		System.out.println("  X X X  X     X   X        X    X    X   ");
    		System.out.println("  X X X  X     X   X        X    X    X   ");
    		System.out.println("   X X   X     X   X        X    X    X   ");
    		System.out.println("   X X    XXXXX  XXXXX    XXXXX   XXXXXX  ");
    		System.out.println("");
    		return RepeatStatus.FINISHED;
    	}
    }
    

    เป็นการแสดงผล Hello World ที่อลังการที่สุดเท่าที่ผมรู้จักมา เหอะๆๆ

  7. รันโปรแกรมโดยใช้คำสั่งของ maven ดังนี้

    mvn clean compile exec:java -Dexec.mainClass=org.springframework.batch.core.launch.support.CommandLineJobRunner -Dexec.args=”jobs.
    xml helloWorldJob”

    ถ้าไม่ติดปัญหาอะไร ก็จะพบข้อความ Hello world แบบอลังการบนหน้าจอ

งานหน้าคือตั้งเวลาแล้วให้ Task มันทำงานตามที่ตั้งเวลาไว้ ยังไม่รู้ว่าทำอย่างไร เดี๋ยวต้องศึกษากันอีกเยอะ

ปล. เว็บต้นฉบับเขามีอัพเดท Spring Batch 2.1.x ด้วย ซึ่งผมเพิ่งเจอ ลองแก้ไขตามเขาดูนะครับ นิดเดียวเอง แล้วก็รันใหม่ http://numberformat.wordpress.com/2011/10/01/hello-world-with-spring-batch-2-1-x/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s