spring-batch是一个为批量处理面生的轻量级框架,关于它的描述不多说了,网上挺多的。下面要说的是一个spring-batch+quartz的一示例,完成的功能是从mysql中定时取数据,然后处理数据,最后再写入到mysql的另一个表里。
pom文件如下,所需要的资源全在里面
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.batch.sample</groupId>
<artifactId>batchSample001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>batchSample001</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<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>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
</dependencies>
</project>
spring-batch+quartz的配置文件如下:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
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-3.1.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"
>
<batch:job id="billingJob" restartable="true">
<batch:step id="billingStep">
<tasklet task-executor="taskExecutor" throttle-limit="50" start-limit="3">
<chunk reader="userDbReader" processor="billingProcessor"
writer="billDbWriter" commit-interval="200" chunk-completion-policy="">
</chunk>
</tasklet>
</batch:step>
</batch:job>
<!-- run every 10 seconds -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0 0/2 * * * ?" />
</bean>
</property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="org.springframework.batch.quartz.JobQuartz" />
<property name="group" value="quartz-batch" />
<property name="jobDataAsMap">
<map>
<entry key="jobName" value-ref="billingJob" />
<entry key="jobRepository" value-ref="jobRepository" />
</map>
</property>
</bean>
<bean id="taskExecutor"
class="org.springframework.core.task.SimpleAsyncTaskExecutor">
</bean>
<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:batch-${ENVIRONMENT:hsql}.properties</value>
</list>
</property>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="false" />
<property name="order" value="1" />
</bean>
<!-- Initialise the database if enabled:
<jdbc:initialize-database data-source="dataSource" enabled="${batch.data.source.init}" ignore-failures="DROPS">
<jdbc:script location="${batch.drop.script}"/>
<jdbc:script location="${batch.schema.script}"/>
</jdbc:initialize-database>
-->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/springbatch" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<!-- processors -->
<bean id="billingProcessor"
class="org.springframework.batch.sample.BillingItemProcessor"></bean>
<!-- readers -->
<bean id="userDbReader"
class="org.springframework.batch.item.database.JdbcPagingItemReader">
<property name="dataSource" ref="dataSource" />
<property name="rowMapper" ref="userDbMapper" />
<property name="queryProvider" ref="userQueryProvider" />
</bean>
<bean id="userDbMapper"
class="org.springframework.batch.sample.UserDbMapper" />
<bean id="userQueryProvider"
class="org.springframework.batch.item.database.support.MySqlPagingQueryProvider">
<property name="selectClause" value="u.id,u.name,u.age,u.balance" />
<property name="fromClause" value="users u" />
<property name="sortKeys">
<map>
<entry key="u.id" value="ASCENDING"/>
<entry key="u.name" value="DESCENDING"/>
</map>
</property>
</bean>
<bean id="billDbWriter"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="dataSource" />
<property name="sql"
value="insert into bills(id,user_id,fees,paid_fees,unpaid_fees,pay_status) values(:id,:user.id,:fees,:paidFees,:unpaidFees,:payStatus)" />
<property name="itemSqlParameterSourceProvider"
ref="itemSqlParameterSourceProvider" />
</bean>
<bean id="itemSqlParameterSourceProvider"
class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
</beans>
quartz的时间调用实现如下:
package org.springframework.batch.quartz;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.sample.BillingItemProcessor;
import org.springframework.core.task.SyncTaskExecutor;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class JobQuartz extends QuartzJobBean{
public static final String RUN_MONTH_KEY = "run.month";
@Override
protected void executeInternal(JobExecutionContext paramJobExecutionContext)
throws JobExecutionException {
Logger logger = LoggerFactory.getLogger(BillingItemProcessor.class);
logger.info("beginning");
SimpleJobLauncher launcher = new SimpleJobLauncher();
Map<String, Object> jobDataMap = paramJobExecutionContext.getMergedJobDataMap();
launcher.setJobRepository((JobRepository) jobDataMap.get("jobRepository"));
launcher.setTaskExecutor(new SyncTaskExecutor());
try {
Map<String, JobParameter> parameters = new HashMap<String, JobParameter>();
parameters.put(RUN_MONTH_KEY, new JobParameter("2011-2"+System.currentTimeMillis()));
Long startTime=System.currentTimeMillis();
JobExecution je = launcher.run((Job) jobDataMap.get("jobName"),
new JobParameters(parameters));
System.out.println("使用时间:"+(System.currentTimeMillis()-startTime));
//System.out.println(je);
//System.out.println(je.getJobInstance());
//System.out.println(je.getStepExecutions());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("endding");
}
}
调用的代码如下:
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(BillingItemProcessor.class);
logger.info("aaaaaaaaaaaaaaa");
System.setProperty("ENVIRONMENT", "mysql");
ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("parallel.xml");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
源码下载地址:http://download.csdn.net/detail/riapgypm/9404081