溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBatch的使用方法

發(fā)布時間:2020-06-02 17:52:16 來源:億速云 閱讀:878 作者:Leah 欄目:編程語言

SpringBatch是什么?一般大家對SpringBatch了解可能停留在概念的層面上,而對于SpringBatch的應用場景和使用方法了解相對較少。今天就跟大家聊聊SpringBatch的應用。

1、概念

Spring Batch 是一款輕量級地適合企業(yè)級應用的批處理框架,值得注意的是,不同于其他調度框架,Spring Batch不提供調度功能。

2、批處理過程

批處理可以分為以下幾個步驟:

  1. 讀取數據
  2. 按照業(yè)務處理數據
  3. 歸檔數據的過程

3、Spring Batch給我們提供了什么?

  1. 統一的讀寫接口
  2. 豐富的任務處理方式
  3. 靈活的事務管理及并發(fā)處理
  4. 日志、監(jiān)控、任務重啟與跳過等特性

4、基礎組件

名稱用途
JobRepository用于注冊和存儲Job的容器
JobLauncher用于啟動Job
Job實際要執(zhí)行的作業(yè),包含一個或多個step
step步驟,批處理的步驟一般包含ItemReader, ItemProcessor, ItemWriter
ItemReader從給定的數據源讀取item
ItemProcessor在item寫入數據源之前進行數據整理
ItemWriter把Chunk中包含的item寫入數據源。
Chunk數據塊,給定數量的item集合,讓item進行多次讀和處理,當滿足一定數量的時候再一次寫入。
TaskLet子任務表, step的一個事務過程,包含重復執(zhí)行,同步/異步規(guī)則等。

5、job, step, tasklet 和 chunk 關系

一個job對應至少一個step,一個step對應0或者1個TaskLet,一個taskLet對應0或者1個Chunk

6、實戰(zhàn):批處理excel插入數據庫

6.1:定義數據倉庫
  <!-- 內存?zhèn)}庫  -->
    <!--<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:定義啟動器
    <!-- 作業(yè)調度器,用來啟動job,引用作業(yè)倉庫 -->
    <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="password" value="${jdbc.mysql.rep.connection.password}" />
        <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有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI