SpringBatch批辦理框架+mysql倉庫+web監控實錄

6、熱戰:批辦理excel插入數據庫
6.1:定義數據倉庫

  <!-- 內存倉庫  -->
    <!--<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"/>-->

    <!-- 數據庫倉庫  -->
    <batch:job-repository id="jobRepository" data-source="dataRepDruidDataSource"
                          isolation-level-for-create="SERIALIZABLE" transaction-manager="transactionManager"
                          table-prefix="BATCH_" max-varchar-length="1000" />

6.2:定義啟動器

    <!-- 作業調度器,用來啟動job,援用作業倉庫 -->
    <bean id="jobLauncher"
          class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository"/>
    </bean>

6.3:定義JOB

    <batch:job id="userBatchJobName" restartable="true">
        <batch:step id="userStep">
            <batch:tasklet allow-start-if-complete="false"
                           start-limit="1" task-executor="taskExecutor" throttle-limit="5">
                <batch:chunk reader="userReader" writer="userWriter"
                             processor="userProcessor" commit-interval="5" retry-limit="10">
                    <batch:retryable-exception-classes>
                        <batch:include class="org.springframework.dao.DuplicateKeyException"/>
                        <batch:include class="java.sql.BatchUpdateException"/>
                        <batch:include class="java.sql.SQLException"/>
                    </batch:retryable-exception-classes>
                </batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>

    <bean id="taskExecutor"
          class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 線程池保護線程的最少數量 -->
        <property name="corePoolSize" value="100"/>
        <!-- 線程池保護線程所准許的空閑時間 -->
        <property name="keepAliveSeconds" value="30000"/>
        <!-- 線程池保護線程的最大數量 -->
        <property name="maxPoolSize" value="300"/>
        <!-- 線程池所使役的緩沖隊列 -->
        <property name="queueCapacity" value="100"/>
    </bean>

6.4:定義ItemReader

     <bean id="userReader" class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="lineMapper" ref="lineMapper"/>
        <property name="resource" value="classpath:message/batch-data-source.csv"/>
    </bean>
 <!-- 將每行映射成對象 -->
    <bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
        <property name="lineTokenizer">
            <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                <property name="delimiter" value=","/><!-- 依據某種分隔符瓜分 -->
                <property name="names" value="id,name" />
            </bean>
        </property>
        <property name="fieldSetMapper"><!-- 將拆分後的字段映射成對象 -->
            <bean class="com.hcw.core.batch.UserFieldSetMapper" />
        </property>
    </bean>

6.5:定義ItemWriter

     <bean id="userWriter" class="com.hcw.core.batch.MyBatchItemWriter" scope="step">
        <property name="statementId" value="com.hcw.core.batch.dao.UserToMapper.batchInsert"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactoryTo"/>
    </bean>

6.6:定義ItemProcessor

    <bean id="userProcessor" class="com.hcw.core.batch.UserItemProcessor"/>

6.7: 定義jobRepository的數據源

   <bean id="dataRepDruidDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.mysql.rep.connection.url}" />
        <property name="username" value="${jdbc.mysql.rep.connection.username}" />
        <property name="密碼" value="${jdbc.mysql.rep.connection.密碼}" />
        <property name="filters" value="${jdbc.mysql.rep.connection.filters}" />
        <property name="maxActive" value="${jdbc.mysql.rep.connection.maxActive}" />
        <property name="initialSize" value="${jdbc.mysql.rep.connection.initialSize}" />
        <property name="maxWait" value="${jdbc.mysql.rep.connection.maxWait}" />
        <property name="minIdle" value="${jdbc.mysql.rep.connection.minIdle}" />
        <property name="timeBetweenEvictionRunsMillis"
                  value="${jdbc.mysql.rep.connection.timeBetweenEvictionRunsMillis}" />
        <property name="minEvictableIdleTimeMillis"
                  value="${jdbc.mysql.rep.connection.minEvictableIdleTimeMillis}" />
        <property name="validationQuery"
                  value="${jdbc.mysql.rep.connection.validationQuery}" />
        <property name="testWhileIdle"
                  value="${jdbc.mysql.rep.connection.testWhileIdle}" />
        <property name="testOnBorrow" value="${jdbc.mysql.rep.connection.testOnBorrow}" />
        <property name="testOnReturn" value="${jdbc.mysql.rep.connection.testOnReturn}" />
        <property name="poolPreparedStatements"
                  value="${jdbc.mysql.rep.connection.poolPreparedStatements}" />
        <property name="maxPoolPreparedStatementPerConnectionSize"
                  value="${jdbc.mysql.rep.connection.maxPoolPreparedStatementPerConnectionSize}" />
    </bean>

6.8: 啟動JOB

啟動tomcat,敞開啟動頁面

SpringBatch批辦理框架+mysql倉庫+web監控實錄

SpringBatch批辦理框架+mysql倉庫+web監控實錄

  1. 讀取數據
  2. 按照業務辦理數據
  3. 歸檔數據的過程

3、Spring Batch給我們提供了啥子?

  1. 一統的讀寫接口
  2. 浩博的任務辦理形式
  3. 靈活的事務管理及並發辦理
  4. 日記、監控、任務重啟與跳過等特性

4、基礎組件

名稱 用場

JobRepository
用於注冊和存儲Job的器皿

JobLauncher
用於啟動Job

Job
實際要執行的作業,包含一個或多個step

step
步驟,批辦理的步驟普通包含ItemReader, ItemProcessor, ItemWriter

ItemReader
從給定的數據源讀取item

ItemProcessor
在item寫入數據源之前施行數據整理

ItemWriter
把Chunk中包含的item寫入數據源。

Chunk
數據塊,給定數量的item聚齊,讓item施行多次讀和辦理,當知足一定數量的時分再一次寫入。

TaskLet
子任務表, step的一個事務過程,包含重復執行,同步/異步規則等。

5、job, step, tasklet 和 chunk 關系
一個job對應至少一個step,一個step對應0還是1個TaskLet,一個taskLet對應0還是1個Chunk

2、批辦理過程
批辦理可以分為以下幾個步驟:

1、概念
Spring Batch 是一款輕量級地適應企業級應用的批辦理框架,值當注意的是,不一樣於其它調度框架,Spring Batch不提供調度功能。


發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *