此系列博客皆為學習Spring Batch時的一些筆記;
Spring Batch Job在運行時有很多元數據,這些元數據一般會被保存在內存或者數據庫中,由於Spring Batch在默認配置是使用HSQLDB,也就是說在Job的運行過程中,所有的元數據都被儲存在內存中,在Job結束后會隨着進程的結束自動消失;在這里我們推薦配置JobRepository去使用MySQL。
在這種情況下,Spring Batch在單次執行或者從一個執行到另外一個執行的時候會使用數據庫去維護狀態,Job執行的信息包括Job實例、傳入的參數、執行的結果、每一個Step執行的結果都會被存儲在數據庫中;數據庫使用了6個表來存儲相關信息:
BATCH_JOB_INSTANCE
我們都知道,在Job運行時,一個Job實例被創建;Job實例包含了Job實例它本身和Job參數;所有Job實例本身的信息將會被保存在BATCH_JOB_INSTANCE表中:
字段 | 描述 |
JOB_INSTANCE_ID | 表的主鍵 |
VERSION | 記錄的版本 |
JOB_NAME | 被執行JOB名 |
JOB_KEY | Job名和Job參數的Hash值,被使用來唯一標示一個Job實例 |
BATCH_JOB_PARAMS
這個表包含了所有被傳遞到Job的參數,正如上面提到的,參數被Spring Batch使用來作為Job標示的一部分。這個表包含的字段如下:
字段 | 描述 |
JOB_INSTANCE_ID | 表示BATCH_JOB_INSTANCE的外鍵 |
TYPE_CD | 表示被存儲的值的類型(string, date, long, double) |
KEY_NAME | Job參數的鍵(Job參數作為鍵值對被傳遞) |
STRING_VAL | 當這個參數是string類型時的值 |
DATE_VAL | 日期型參數值 |
LONG_VAL | 長整型參數值 |
DOUBLE_VAL | 雙精度或者單精度型參數值 |
BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION
當一個Job被創建並執行時,這個Job的運行狀態被保存在BATCH_JOB_EXECUTION表中,其中包括:開始時間、結束時間、最近一次執行的結果;
BATCH_STEP_EXECUTION表和BATCH_JOB_EXECUTION差不多,它包含了每一個Step在執行過程中的開始時間、結束時間、commit的次數、Step狀態相關的參數;
BATCH_JOB_EXECUTION表的字段信息:
字段 | 描述 |
JOB_EXECUTION_ID | 表的主鍵 |
VERSION | 記錄的版本 |
JOB_INSTANCE_ID | 到BATCH_JOB_INSTANCE表的外鍵 |
CREATE_TIME | Job實例被創建的時間 |
START_TIME | Job開始執行的時間 |
END_TIME | Job執行結束的時間,不管成功與否 |
STATUS | Job被執行的狀態 |
EXIT_CODE | Job返回時的退出碼 |
EXIT_MESSAGE | Job返回時的推出消息 |
LAST_UPDATED | 當前記錄上一次被更新的時間 |
BATCH_STEP_EXECUTION表的字段信息:
STEP_EXECUTION_ID | 表的主鍵 |
VERSION | 記錄的版本 |
STEP_NAME | 被配置在Job xml中的Step的名字 |
JOB_EXECUTION_ID | 連接到BATCH_JOB_EXECUTION表的外鍵 |
START_TIME | Step開始的時間 |
END_TIME | Step完成的時間,無論成功與否 |
STATUS | Step當前的狀態 |
COMMIT_COUNT | 當前Step被Commit的次數 |
READ_COUNT | 當前Step讀取數據庫的次數 |
FILTER_COUNT | 當前Step讀取到的item數量 |
WRITE_COUNT | 當前Step寫的Item數量 |
READ_SKIP_COUNT | 讀取Item時跳過的數量 |
WRITE_SKIP_COUNT | 寫Item時跳過的數量 |
PROCESS_SKIP_COUNT | 在ItemReader讀取后,沒有經過ItemProcessor處理的item的數量 |
ROLLBACK_COUNT | 在Step執行過程中,總的Rollback的數量 |
EXIT_CODE | Step完成時返回的退出碼 |
EXIT_MESSAGE | Step完成時返回的退出消息 |
LAST_UPDATED | 這條記錄上次被更新的時間 |
BATCH_JOB_EXECUTION_CONTEXT和BATCH_STEP_EXECUTION_CONTEXT
這是兩個Context相關的表,它們分別用於存儲Job或者Step相關的ExecutionContext的持久化版本,Spring Batch中的ExecutionContext類似於WEB應用程序中的Servlet Context或Session,它們都提供了一個存儲信息的全局空間,本質上是作用域在Job或者Step中的一個鍵值對;這個Job或者Step的ExecutionContext被用來在特定的作用域里面傳遞信息,如果是Job,它就用來在Step與Step之間傳遞信息,如果是Step,它用來在多個記錄的處理過程中傳遞信息。
表BATCH_JOB_EXECUTION_CONTEXT和BATCH_STEP_EXECUTION_CONTEXT是這些鍵值對的序列化版本,它們除了一個外鍵不同之外,其它幾乎都相同;
字段 | 描述 |
JOB_EXECUTION_ID/STEP_EXECUTION_ID | 引用自表BATCH_JOB_EXECUTION或BATCH_STEP_EXECUTION的外鍵 |
SHORT_CONTEXT | Context的字符串表示 |
SERIALIZED_CONTEXT | 一個被序列化的ExecutionContext,以便在將來重試的時候使用 |