目的:通過jdbc連接讀取數據庫的記錄,寫入到單個文件中
源數據表
- 我們還以上篇文章解析后的結果作為源數據表。
源數據源表
寫入的文本格式
- 按照dateStr,userCode,time,path,userAgent 用逗號分隔作為一行
Spring Batch 代碼實現
依舊三部分:ItemReader、ItemProcessor、ItemWriter
-
ItemReader實現:通過JDBC連接數據庫,執行sql語句,把查詢出的結果集映射到實體類
AccessBean
中。Spring Batch3提供了這種場景下的ItemReader實現:org.springframework.batch.item.database.JdbcCursorItemReader
。 - ItemProcessor實現:這里不對數據處理,直接寫入文件中
-
ItemWriter實現:把查詢到的數據按行組織數據,逗號分隔,寫入到輸出文件中。Spring Batch3本身實現了寫文本的ItemWriter:
org.springframework.batch.item.file.FlatFileItemWriter
,可以自定義數據組織和分隔符等。
我們可以看到,幾乎沒有任何實現代碼,很多事情Spring Batch都提供了默認的實現。
Spring Batch Job配置
- Job
<batch:job id="readDB2FileJob">
<batch:step id="readDB2FileStep">
<batch:tasklet>
<batch:chunk reader="jdbcItemReader" writer="fileWriter" commit-interval="5000" ></batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
- logReader
<!-- jdbc Reader -->
<bean id="jdbcItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<!-- 數據源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 游標一次讀多少行 -->
<property name="fetchSize" value="5000"></property>
<!-- 查詢sql -->
<property name="sql">
<value>
<![CDATA[
SELECT date_str, `path`, userCode, `time`, userAgent FROM access
]]>
</value>
</property>
<!-- 行映射對象 -->
<property name="rowMapper">
<bean class="org.springframework.jdbc.core.BeanPropertyRowMapper">
<property name="mappedClass" value="com.me.springbatch.support.AccessBean"></property>
</bean>
</property>
</bean>
- fileWriter
<!-- write to file Writer -->
<bean id="fileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<!-- 輸出文件 -->
<property name="resource" value="file:/my/out.log"></property>
<!-- 如果目標文件已存在,是否刪除 -->
<property name="shouldDeleteIfExists" value="true"></property>
<!-- 行策略 -->
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<!-- 逗號分隔 -->
<property name="delimiter" value=","></property>
<property name="fieldExtractor">
<bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<!-- 行數據(字段、順序) -->
<property name="names" value="dateStr,userCode,time,path,userAgent"></property>
</bean>
</property>
</bean>
</property>
</bean>
FlatFileItemWriter
類有一個重要的屬性就是lineAggregator
,用來描述如何組織行數據的。Spring Batch提供了一個實現DelimitedLineAggregator
,在多數情況下都可以通過此類處理。
- 運行Job
App.run("readDB2FileJob");