副标题[/!--empirenews.page--]
上面介绍了Spring Batch的基本概念和简单的demo项目,显然这些还是不够实际使用的。下面我们来更多的代码实践。
? ? ? ? 在上面的基础项目上面,我们来更多的修改:
? ? ? ? 不用项目默认的hsql DB,用mysql,让ItemReader,ItemWriter 支持mysql;
? ? ? ? 支持处理结果自定义保存到数据库,我们用项目里面的JPA;
? ? ? ? 让Quartz来定时调用spring batch的Job
? ? ? ? 可以读取文件,而不只是数据库;
下面开始动手。
? ? ? ? ? 修改pom.xml,节选部分,实在太长了。
? ? ? ? ? <spring.framework.version>3.2.0.RELEASE</spring.framework.version> ? ? ? ? ? <spring.batch.version>2.1.7.RELEASE</spring.batch.version> ? <!-- ?这个的版本和quartz的版本要注意,不然很容易在运行的时候出错 -->
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.23</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.3.2.RELEASE.rebuild</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.0.RELEASE</version> </dependency>
launch-context.xml定义需要用到的bean,
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="spring" /> <property name="dataSource" ref="dataSource" /> <property name="jpaDialect"> ? ? <bean class="com.test.batch.CustomHibernateJpaDialect" /> ? </property> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> </property> </bean> <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/testbatch?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean> <bean id="customerMapper" class="com.test.batch.CustomerMapper"></bean> <bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"></bean> ? ? ? ? <!-- ? 这个可以让spring batch和hibernate共用 <bean id="itemReader" class="org.springframework.batch.item.database.HibernateCursorItemReader"> <property name="sessionFactory" ref="sessionFactory" /> <property name="queryString" value="from CustomerCredit" /> </bean> --> <bean id="itemReaderFile" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <property name="lineMapper"> <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <property name="lineTokenizer" ref="lineTokenizer"/> <property name="fieldSetMapper" ref="customerMapper"/> </bean> ?? </property> <!-- <property name="resource" value="file:#{jobParameters['customFileAbPath']}"/> ? 配置读取文件的路径,我固定了 ? ? ? --> <property name="resource" value="file:D:/temp/testdata.txt"/> </bean> <bean id="itemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> ? ? <property name="dataSource" ref="dataSource"/> ? ? <property name="sql" value="select ID,NAME,CREDIT from CUSTOMER"/> ? ? <property name="rowMapper"> ? ? ? ? <bean class="com.test.batch.CustomerCreditRowMapper"/> ? ? </property> ? ? <property name="fetchSize" value="100"></property> ? ? <property name="maxRows" value="10000"></property> </bean>
<jdbc:initialize-database data-source="dataSource"> <!-- <jdbc:script location="${batch.schema.script}" /> --> <jdbc:script location="org/springframework/batch/core/schema-drop-mysql.sql" /> <jdbc:script location="org/springframework/batch/core/schema-mysql.sql" /> </jdbc:initialize-database
<!-- batch:job-repository id="jobRepository" / --> <batch:job-repository id="jobRepository" data-source="dataSource" transaction-manager="transactionManager" isolation-level-for-create="SERIALIZABLE" table-prefix="BATCH_" /> ? ? ? ? <!-- 下面是Quartz调用spring batch 的job要用到的 --> ? ? ? ? <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list><ref bean="scheduledTrigger"></ref></list> </property> </bean>
<bean id="scheduledTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> ? ? <property name="jobDetail" ref="jobDetail"/> ? ? <property name="cronExpression"> ? ? ? ? <value>*/10 * * * * ?</value> ? ? </property> </bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.test.batch.JobLauncherDetails" /> <property name="jobDataAsMap"> <map> <entry key="jobName" value="job1" /> ?<!--指定jobID --> <entry key="jobLocator" value-ref="jobRegistry" /> <entry key="jobLauncher" value-ref="jobLauncher" /> <entry key="param1" value="p1" /> <entry key="param2" value="p2" /> </map> </property> <property name="durability" value="true" /> </bean>
? ? ? ? <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> ? </bean>
? <bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor"> <property name="jobRegistry" ref="jobRegistry" /> ? ? ? ?</bean>
? ? ? ?<bean id="jobRegistry"?class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<import resource="classpath:/META-INF/spring/module-context.xml" />
有几个定制的东西,需要说下。
我们用到的domain对象是这样的,很多不必要的都省略了
(编辑:好传媒网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|