ความเดิมตอนที่แล้ว :
กล่าวถึงการ cofig เบื้องต้นของ spring-batch แล้วก็ xml ตัวพ่ออย่าง pom มาตอนนี้ ไม่พูดพร่ำทพเพลงครับ เด่วลืม เขียนต่อกันไปเลยดีกว่า
เราก็มาดูกันต่อเลย ก็คือ config ตัวพระเอกของเราคือตัว job กันหล่ะครับ โดยเราก็ ไป regis bean
<bean id="tm" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="tm"/>
</bean>
<bean id="usersLoadStep" class="org.springframework.batch.core.step.item.SimpleStepFactoryBean">
<property name="transactionManager" ref="tm"/>
<property name="jobRepository" ref="jobRepository"/>
<property name="itemReader" ref="reader"/>
<property name="itemWriter" ref="writer"/>
</bean>
<bean id="usersLoadJob" class="org.springframework.batch.core.job.SimpleJob">
<property name="jobRepository" ref="jobRepository"/>
<property name="steps">
<list>
<ref bean="usersLoadStep"/>
</list>
</property>
</bean>
<bean id="writer" class="com.spring66.tutorial.batch.DatabaseWriter"/>
ว่ากันที่ตัวแรก tm ว้าววว ไม่น่าแปลกใจ เพราะ job ก็คือ งานงานนึงที่สำคัญ จึงมี TransactionManager มาครอบไม่น่าสงสัย
ตัวที่สอง ก็ jobRepository ตัวนี้เล่าแล้วยาวมาก ขอให้ตามไปอ่านเอานะครับ จริงๆ แล้วก็ ผมเองก็ไม่ได้เข้าใจแบบสามารถอธิบายได้ดีนัก
เหมือน design pattern ที่นิยมชมชอบ FactoryBean หรือ step ที่เราพูดถึงตอนแรก usersLoadJob นี่หล่ะพระเอกของเรา
โดยจุดที่น่าสนใจคือ list parameter
<property name="steps">
<list>
<ref bean="usersLoadStep"/>
</list>
</property>
นั่นเอง นั่นคือจุดที่บอกว่าหนึ่งงานอาจจะมีหลาย step ก็ได้ นั่นเอง ตรงนี้หล่ะจร้า
ส่วนตัวสุดท้าย
เอ้อันนี้ผมพูดไปหรือยังน้อ เอาเป็นว่ามันคือคลาสที่เราสร้างมา นั่นเองหรือ process ที่เราจะสร้างและให้ทำงานตามที่ใจเราปราถนา นั่นเอง
โดยหน้าตาผมก็เอาแบบง่ายๆไม่มีเทพแถมด้วยถึงแบบนี้ครับ
package com.spring66.tutorial.batch;
import org.springframework.batch.item.ClearFailedException;
import org.springframework.batch.item.FlushFailedException;
import org.springframework.batch.item.ItemWriter;
/**
*
* @author Phongsak
*/
public class DatabaseWriter implements ItemWriter {
public void write(Object item) throws Exception {
System.out.println(" "+ item.getClass().toString());
System.out.println("insert to database...");
}
public void flush() throws FlushFailedException {
}
public void clear() throws ClearFailedException {
}
}
อ่ะ ใช้ sout debug แบบเมพๆ เนี่ยหล่ะครับ ดูแล้วก็ น่าสนใจถ้า เราทำการ อะแด๊พ แอ๊พพาย หน่อยก็เอาไปต่อกับ dao ของคุณ roofimon ได้เลย โอ้วช่างสมใจ
อ่ะเท่านี้หล่ะทีนี้ก็หาทางทำให้มันทำงานกันดีกว่า คำเท่ๆ พูดให้ชินทำให้ เคยมือ ก็คือ เขียน test ครับ
package com.spring66.tutorial;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.job.SimpleJob;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
public class BaseSpringTestCase extends AbstractDependencyInjectionSpringContextTests {
protected final Log log = LogFactory.getLog(getClass());
@Override
protected String[] getConfigLocations() {
setAutowireMode(AUTOWIRE_BY_NAME);
return new String[]{
//"classpath:/applicationContext.xml",
"classpath*:/applicationContext.xml" // for modular projects
//"classpath:**/applicationContext*.xml" // for web projects
};
}
public void testLoadUsers() {
Job job = (SimpleJob) super.applicationContext.getBean("usersLoadJob");
JobParameters jobParameters = new JobParameters();
JobRepository jobRepository = (JobRepository) super.applicationContext.getBean("jobRepository");
try {
JobExecution je = jobRepository.createJobExecution(job, jobParameters);
job.execute(je);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
ถึงตรงนี้ผมคงไม่ขอขยายความนะครับ ลองแก้ ลองเขียนกันไปเลยดีกว่า แล้วแบ่งปันประสบการกันบ้างนะครับ มันยังมีอีกหลายวิธีวันหลัง จะมาต่อนะครับ
เพราะอีกเดี๋ยวผมคงต้องเอาไป implements ในงานเหมือนกัน ตอนนี้แค่เอามาอ่านเฉยๆ เลยออกมาไม่ค่อย เคลียเท่าไหร่
