Step
Stepμ μ€μ§μ μΈ λ°°μΉ μ²λ¦¬λ₯Ό μ μνκ³ μ μ΄νλ λ° νμν λͺ¨λ μ λ³΄κ° λ€μ΄μλ λλ©μΈ κ°μ²΄λ‘, Jobμ μ²λ¦¬νλ μ€μ§μ μΈ λ¨μλ‘ μ°μΈλ€.(Job:Step = 1:M)
Stepμ Jobμ ꡬμ±νλ λ 립λ μμ λ¨μ
μμ°¨μ μΌλ‘ λ°°μΉ μ²λ¦¬ μν
Stepμ λͺ¨λ λ¨μ μμ μ μ‘°κ°μΌλ‘ μ체μ μΌλ‘ μ λ ₯, μ²λ¦¬κΈ°, μΆλ ₯μ λ€λ£¬λ€.
νΈλμμ μ Step λ΄λΆμμ μ΄λ£¨μ΄μ§
org.springframework.batch.core.Step
StepExecution
Stepμ μ€ν μ 보λ₯Ό λ΄λ κ°μ²΄λ‘, κ°κ°μ Stepμ΄ μ€νλ λλ§λ€ StepExecutionμ΄ μμ±λλ€.
public class StepExecution extends Entity {
private final JobExecution jobExecution; // νμ¬ JobExecution μ 보
private final String stepName; // Step μ΄λ¦
private volatile BatchStatus status; // Stepμ μ€ν μν(COMPLETED, STARTING, STARTED ...)
private volatile int readCount; // μ±κ³΅μ μΌλ‘ μ½μ λ μ½λ μ
private volatile int writeCount; // μ±κ³΅μ μΌλ‘ μ΄ λ μ½λ μ
private volatile int commitCount; // Stepμ μ€νμ λν΄ μ»€λ°λ νΈλμμ
μ
private volatile int rollbackCount; // Stepμ μ€νμ λν΄ λ‘€λ°±λ νΈλμμ
μ
private volatile int readSkipCount; // μ½κΈ°μ μ€ν¨ν΄ 건λ λ λ μ½λ μ
private volatile int processSkipCount; // νλ‘μΈμ€κ° μ€ν¨ν΄ 건λ λ λ μ½λ μ
private volatile int writeSkipCount;// μ°κΈ°μ μ€ν¨ν΄ 건λ λ λ μ½λ μ
private volatile Date startTime; // Stepμ΄ μ€νλ μκ°(null == μμλμ§ μμ)
private volatile Date endTime; // Stepμ μ€ν μ±κ³΅ μ¬λΆμ κ΄κ³ μμ΄ λλ μκ°
private volatile Date lastUpdated; // λ§μ§λ§μΌλ‘ μμ λ μκ°
private volatile ExecutionContext executionContext; // Step μ€ν μ¬μ΄μ μ μ§ν΄μΌνλ μ¬μ©μ λ°μ΄ν°
private volatile ExitStatus exitStatus; // Step μ€ν κ²°κ³Όμ λν μν κ°(UNKOWN, EXECUTING, COMPLETE, ...)
private volatile boolean terminateOnly; // Job μ€ν μ€μ§ μ¬λΆ
private volatile int filterCount; // μ€νμμ νν°λ§λ λ μ½λ μ
private transient volatile List<Throwable> failureExceptions; // Step μ€νμ€ λ°μν μμΈ λ¦¬μ€νΈ
...
}Tasklet κΈ°λ°
Tasklet κΈ°λ°Taskletμ μμμStepμ μ€νν λ νλμ μμ μ μ²λ¦¬νλ λ°©μμ½κΈ°, μ²λ¦¬, μ°κΈ°λ‘ λλ λ°©μμ΄ μ²ν¬ μ§ν₯ νλ‘μΈμ±μ΄λΌλ©΄ μ΄λ₯Ό λ¨μΌ μμ μΌλ‘ λ§λλ κ°λ μ΄
TaskletνΈλμμ λ΄μμ λ‘μ§μ΄ μ€νλ μ μλ κΈ°λ₯μ μ 곡νλ μ λ΅ μΈν°νμ΄μ€
org.springframework.batch.core.step.tasklet.Tasklet
Adapter
CallableTaskletAdapter
CallableTaskletAdapterorg.springframework.batch.core.step.tasklet.CallableTaskletAdapterCallable<V>μΈν°νμ΄μ€μ ꡬν체λ₯Ό ꡬμ±ν μ μκ² ν΄μ£Όλ Adapter리ν΄κ°μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ 곡μ κ°μ²΄λ₯Ό μ¬μ©νμ§ μλλ€.
μ²΄ν¬ μμΈλ₯Ό μΈλΆλ‘ λμ§ μ μλ€.
Stepμ νΉμ λ‘μ§μ ν΄λΉ Stepμ΄ μ€νλλ μ€λ λκ° μλ λ€λ₯Έ μ€λ λμμ μ€ννκ³ μΆμ λ μ¬μ©
MethodInvokingTaskletAdapter
MethodInvokingTaskletAdapterorg.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter1λ€λ₯Έ ν΄λμ€ λ΄μ λ©μλλ₯Ό Taskletμ²λΌ μ€ν κ°λ₯
TargetMethodλ ExitStatus.COMPLETED defaultμ΄λ©°, ExitStatusλ₯Ό λ°ννλ©΄ λ©μλκ° λ°νν κ°μ΄ Taskletμμ λ°νλλ€.
SystemCommandTasklet
SystemCommandTaskletorg.springframework.batch.core.step.tasklet.SystemCommandTaskletμμ€ν λͺ λ Ήμ μ€νν λ μ¬μ©νλ©°, μ§μ ν μμ€ν λͺ λ Ήμ λΉλκΈ°λ‘ μ€ννλ€.
SimpleSystemProcessExitCodeMapper
Chunk κΈ°λ°
Chunk κΈ°λ°
Chunkλ μμ΄ν μ΄ νΈλμμ μ commitλλ μλ₯Ό λ§νλ€.
μ¦, μ²ν¬ μ§ν₯ μ²λ¦¬λ ν λ²μ νλμ© λ°μ΄ν°λ₯Ό μ½μ΄ ChunkλΌλ λ©μ΄λ¦¬λ₯Ό λ§λ λ€, Chunk λ¨μλ‘ νΈλμμ μ λ€λ£¨λ κ²μ μλ―Ένλ€.
Chunk μ§ν₯ νλ‘μΈμ±μ 1000κ°μ λ°μ΄ν°μ λν΄ λ°°μΉ λ‘μ§μ μ€ννλ€κ³ κ°μ νλ©΄, Chunk λ¨μλ‘ λλμ§ μμμ κ²½μ°μλ νκ°λ§ μ€ν¨ν΄λ μ±κ³΅ν 999κ°μ λ°μ΄ν°κ° λ‘€λ°±λλ€. Chunk λ¨μλ₯Ό 10μΌλ‘ νλ€λ©΄, μμ μ€μ λ€λ₯Έ Chunkλ μν₯μ λ°μ§ μλλ€.
μ΄λ, Chunkλ μ»€λ° κ°κ²©(commit interval)μ μν΄ μ μλκ³ μννλ―λ‘, μ»€λ° κ°κ²©μ λ°λΌ μ±λ₯μ΄ λ¬λΌμ§ μ μλ€. μ΅μμ μ±λ₯μ μ»κΈ° μν΄μλ μ»€λ° κ°κ²© μ€μ μ΄ μ€μνλ€.
ItemReader, ItemProcessor, ItemWriter 3λ¨κ³λ‘ λΉμ§λμ€ λ‘μ§μ λΆλ¦¬ν΄ μν μ λͺ
ννκ² λΆλ¦¬ν μ μλ€.
λΉμ¦λμ€ λ‘μ§ λΆλ¦¬
μ½μ΄μ¨ λ°°μΉ λ°μ΄ν°μ μ°μ¬μ§ λ°μ΄ν° νμ μ΄ λ€λ₯Έ κ²½μ°μ λν λμ
κ° Chunkλ μ체 νΈλμμ μΌλ‘ μ€νλλ©°, μ²λ¦¬μ μ€ν¨νλ©΄ μ±κ³΅ν νΈλμμ μ΄νλΆν° λ€μ μμ κ°λ₯
κ·Έλ¬λ―λ‘ μ½μ΄μ¨ λ°°μΉμ λ°μ΄ν°μ μ μ₯ν λ°μ΄ν° νμ μ΄ λ€λ₯Έ κ²½μ°μ λμν μ μλ€.
ItemReader
Stepμ λμμ΄ λλ λ°°μΉ λ°μ΄ν°(File, Xml, DB λ±)λ₯Ό μ½μ΄μ€λ μΈν°νμ΄μ€org.springframework.batch.item.ItemReader<T>
ItemProcessor
ItemReaderλ‘ μ½μ΄ μ¨ λ°°μΉ λ°μ΄ν°λ₯Ό λ³ννλ μν μ μνItemProcessorλ λ‘μ§ μ²λ¦¬λ§ μννμ¬ μν μ λΆλ¦¬νκ³ , λͺ νν input/outputμItemProcessorλ‘ κ΅¬νν΄λμΌλ©΄ λ μ§κ΄μ μΈ μ½λκ° λ κ²μ΄λ€.org.springframework.batch.item.ItemProcessor<T>
ItemWriter
λ°°μΉ λ°μ΄ν°(DB, File λ±)λ₯Ό μ μ₯νλ€.
org.springframework.batch.item.ItemWriter<T>
리μ€νΈμ λ°μ΄ν° μλ μ€μ ν *μ²ν¬(Chunk) λ¨μλ‘ λΆλ¬μ¨λ€.
μ²ν¬ κΈ°λ° Job μμ
μΌλ°μ μΌλ‘λ μμ κ°μ΄ 컀λ°κ°κ²©μ νλ μ½λ©ν΄ ν¬κΈ°λ₯Ό μ μνμ§λ§, ν¬κΈ°κ° λμΌνμ§ μμ μ²ν¬λ₯Ό μ²λ¦¬ν΄μΌνλ κ²½μ°λ μλ€. μ€νλ§ λ°°μΉλ org.springframework.batch.repeat.CompletionPolicy μΈν°νμ΄μ€λ₯Ό μ κ³΅ν΄ μ²ν¬κ° μλ£λλ μμ μ μ μν μ μλλ‘ μ 곡ν΄μ€λ€.
CompletionPolicy
μ²ν¬ μλ£ μ¬λΆλ₯Ό κ²°μ ν μ μλ κ²°μ λ‘μ§μ ꡬνν μ μλ μΈν°νμ΄μ€λ‘, CompletionPolicy μΈν°νμ΄μ€μ ꡬν체μ λν΄μ μμ λ³Ό κ²μ΄λ€.
μ§μ ꡬννλ λ°©λ²
CompletionPolicyλ₯Ό ꡬννμ¬ νμ λ©μλλ€μ κ°κ° μλ§κ² λ‘μ§μ ꡬμ±νλ©΄λλ€.
λ€μκ³Ό κ°μ΄ RandomμΌλ‘ μ§μ λ μλ§νΌ chunkκ° μνλλ κ²μ νμΈ ν μ μλ€.
SimpleCompletionPolicy
κ°μ₯ κΈ°λ³Έμ μΈ κ΅¬ν체λ‘, 미리 ꡬμ±ν΄λ μκ³κ°μ λλ¬νλ©΄ μ²ν¬ μλ£λ‘ νμνλ€.
TimeoutTerminationPolicy
νμμμ κ°μ ꡬμ±ν΄, μ²ν¬ λ΄μμ μ²λ¦¬ μκ°μ΄ μ§μ ν μκ°μ΄ λμΌλ©΄ μ²ν¬κ° μλ£λ κ²μΌλ‘ κ°μ£Όνκ³ , λͺ¨λ νΈλμμ
μ²λ¦¬λ₯Ό μ μμ μΌλ‘ νλ€λ κ²μ΄λ€. TimeoutTerminationPolicy λ§μΌλ‘ μ²ν¬ μλ£ μμ μ κ²°μ νλ κ²½μ°λ κ±°μ μ‘΄μ¬νμ§ μμΌλ©°, CompositeCompletionPolicyμ μΌλΆλ‘ μ¬μ©νλ κ²½μ°κ° λ§λ€.
TimeoutTerminationPolicyλ‘ μνν κ²½μ° κ° chunk λ¨μλ₯Ό νμΈν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ μ κ°κ°μΈ κ²μ λ³Ό μμλ€.
CompositeCompletionPolicy
CompositeCompletionPolicyλ μ²ν¬ μλ£ μ¬λΆλ₯Ό κ²°μ νλ μ¬λ¬ μ μ±
μ ν¨κ» ꡬμ±ν μ μλ€. ν¬ν¨νκ³ μλ μ¬λ¬ μ μ±
μ€ νλλΌλ μ²ν¬ μλ£λΌκ³ νλ¨λλ©΄ ν΄λΉ μ²ν¬κ° μλ£λ κ²μΌλ‘ νμνλ€.
λ€μκ³Ό κ°μ΄ μνν κ²½μ°μλ chunk λ¨μκ° 1000κ°λ₯Ό λμ΄μ κ²½μ°κ° μλ κ²μ νμΈν μ μλ€.
Step Listener
μ€νκ³Ό μ²ν¬μ μμκ³Ό λμμ νΉμ λ‘μ§μ μ²λ¦¬ν μ μκ² ν΄μ€λ€.
(StepListenerλ λͺ¨λ μ€ν 리μ€λκ° μμνλ λ§μ»€ μΈν°νμ΄μ€μ΄λ€.)
λͺ¨λ μμ€μ 리μ€λλ₯Ό μ μ©ν΄ Jobμ μ€λ¨ν μ μμΌλ©°, μΌλ°μ μΌλ‘ μ μ²λ¦¬λ₯Ό μννκ±°λ μ΄ν κ²°κ³Όλ₯Ό νκ°νκ±°λ, μΌλΆ μ€λ₯μ²λ¦¬μλ μ¬μ©λλ€.
StepExecutionListener
StepExecutionListenerorg.springframework.batch.core.StepExecutionListener
@BeforeStep, @AfterStep μ λν
μ΄μ
μ 곡
ChunkListener
ChunkListener@BeforeChunk, @AfterChunk μ λν
μ΄μ
μ 곡
Step Flow
쑰건 λ‘μ§
μ€νλ§ λ°°μΉμ Stepμ StepBuilderμ .next() λ©μλλ₯Ό μ¬μ©ν΄ μ§μ ν μμλλ‘ μ€νλλ€. μ μ΄(transition)λ₯Ό ꡬμ±ν΄ κ²°κ³Όμ λ°λ₯Έ λ€λ₯Έ μμλ‘ μ€ννλ κ²λ κ°λ₯νλ€.
μ€νλ§ λ°°μΉλ κΈ°μ€μ λ°λΌ λκ°μ μμΌλ μΉ΄λλ₯Ό νμ©νλ€.
*: 0κ° μ΄μμ λ¬Έμλ₯Ό μΌμΉνλ κ²μ μλ―ΈC*: COMPLETE, CORRECT
?: 1κ°μ λ¬Έμλ₯Ό μΌμΉ μν€λ κ²μ μλ―Έ?AT: CAT, KATκ³Ό μΌμΉνμ§λ§, THATκ³Όλ λΆμΌμΉ
JobExecutionDecider
Job μ€ν μ 보(jobExecution)μ μ€ν μ€νμ 보( stepExecution)λ₯Ό μΈμλ‘ λ°μ λͺ¨λ μ 보λ₯Ό μ΄μ©ν΄ λ€μμ 무μμ μνν μ§μ λν΄ κ²°μ ν μ μλ€.
Job μ’
λ£νκΈ°
μ€νλ§ λ°°μΉμμλ Jobμ μ’ λ£ν λ μλ 3κ°μ§ μνλ‘ μ’ λ£ν μ μλ€.
Completed(μλ£)
μ€νλ§ λ°°μΉ μ²λ¦¬κ° μ±κ³΅μ μΌλ‘ μ’
λ£λμμ μλ―Έ
JobInstanceκ° Completedλ‘ μ’
λ£λλ©΄ λμΌν νλΌλ―Έν°λ₯Ό μ¬μ©ν΄ λ€μ μ€νν μ μλ€.
Failed(μ€ν¨)
μ‘μ΄ μ±κ³΅μ μΌλ‘ μλ£λμ§ μμμμ μλ―Έ Failed μνλ‘ μ’ λ£λ μ‘μ μ€νλ§ λ°°μΉλ₯Ό μ¬μ©ν΄ λμΌν νλΌλ―Έν°λ‘ λ€μ μ€νν μ μλ€.
Stopped(μ€μ§)
Stopped μνλ‘ μ’ λ£λ μ‘μ λ€μ μν κ°λ₯νλ€. Jobμ μ€λ₯κ° λ°μνμ§ μμμ΄λ, μ€λ¨λ μμΉμμ μ‘μ λ€μ μμν μ μλ€. μ¬λμ κ°μ μ΄ νμνκ±°λ λ€λ₯Έ κ²μ¬/μ²λ¦¬κ° νμν μν©μ μ μ©νλ€.
BatchStatusλ₯Ό νλ³ν λ, ExitStatusλ₯Ό νκ°νλ©΄μ μλ³λλ€. ExitStatusλ μ€ν
, μ²ν¬, μ‘μμ λ°νλ μ μμΌλ©°, BatchStatusλ StepExecution μ΄λ JobExecution λ΄μ 보κ΄λλ©°, JobRepositoryμ μ μ₯λλ€.
Completed μνλ‘ μ’
λ£νκΈ°
.end() λ©μλ μ¬μ©
BATCH_STEP_EXECUTION ν
μ΄λΈμ μ€ν
μ΄ λ°νν ExitStatusκ° μ μ₯λλ©°, μ€ν
μ΄ λ°νν μνκ° λ¬΄μμ΄λ μκ΄μμ΄ BATCH_JOB_EXECUTIONμ COMPLETEDκ° μ μ₯λλ€.
Failed μνλ‘ μ’
λ£νκΈ°
fail() λ©μλ μ¬μ©
μ¬κΈ°μ firstStep() μ΄ FAILEDλ‘ λλλ©΄, JobRepository μ ν΄λΉ Jobμ΄ μ€ν¨ν κ²μΌλ‘ μ μ₯λλ©°, λμΌν νλΌλ―Έν°λ₯Ό μ¬μ©ν΄ λ€μ μ€νν μ μλ€.
Stopped μνλ‘ μ’
λ£νκΈ°
.stopAndRestart() λ©μλλ‘ μ‘μ λ€μ μννλ€λ©΄, 미리 ꡬμ±ν΄λ μ€ν
λΆν° μμλλ€. μλ μμ μμλ μ¬μνμ successStep()λΆν° μνλλκ²μ λ³Ό μ μλ€.
Last updated
Was this helpful?