Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÁ˽â Spring Ö® Spring Batch ¿ò¼Ü
 
×÷ÕߣºÇñѧ†´
  2197  次浏览      29
 2021-8-6
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁËspring batchµÄ¸ÅÄî¡¢ batch ÖÐËùÉæ¼°µÄ¸ÅÄîÒÔ¼°¶ÔÓ¦µÄÀàͼ¡¢¾ßÌåÈçºÎ´´½¨ÕâЩÀàµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚ InfoQ £¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

Ò». ¸ÅÊö

spring batch ÊÇ spring ÌṩµÄÒ»¸öÊý¾Ý´¦Àí¿ò¼Ü£¬Æä¹¦ÄܰüÀ¨¼Ç¼/¸ú×Ù£¬ÊÂÎñ¹ÜÀí£¬×÷ҵͳ¼Æ£¬×÷ÒµÖØÆô£¬Ìø¹ýºÍ×ÊÔ´¹ÜÀíµÈ¡£Ëü»¹ÌṩÁ˸ü¸ß¼¶µÄ¼¼Êõ·þÎñºÍ¹¦ÄÜ£¬Í¨¹ýÓÅ»¯ºÍ·ÖÇø¼¼ÊõʵÏÖ¼«¸ßÈÝÁ¿ºÍ¸ßÐÔÄܵÄÅú´¦Àí×÷Òµ¡£

Ê×ÏÈ»á¶ÔÆä¿ò¼ÜËùÉæ¼°µ½¸ÅÄî½øÐн²½â£¬½Ó×Å¶ÔÆä¿ò¼Ü´óÌåÔ­Àí½øÐнâ¶Á¡£

¶þ. ¸ÅÄî¼°Ô­Àí

1. JobLauncher

¸Ã½Ó¿ÚÊÇÆô¶¯ÈÎÎñµÄÖ÷ÒªÈë¿Ú£¬ÆäÈë²ÎÊÇ Job ʵÀý£¬ÒÔ¼° Job ¶ÔÓ¦µÄ²ÎÊýÐÅÏ¢¡£ÆäʵÏÖÀàΪ SImpleJobLauncher À࣬ÆäÀïÃæÓÐÁ½¸ö¹Ø¼üµÄÊôÐÔ³ÉÔ±£º

¡¤jobRepository ±£´æÈÎÎñ»òÕß¼ìË÷ÈÎÎñµÄÐÅÏ¢£»

¡¤taskExecutor ÈÎÎñÖ´ÐÐÆ÷£¬Ö÷ÒªÊÇͬ²½Ö´Ðл¹ÊÇÒì²½Ö´ÐÐÈÎÎñ£»

Á÷³ÌͼÈçÏ£º

ÿ¸ö Step µÄÔËÐÐ״̬¶¼ÓÐÄÄЩ£¬¿ÉÒԲ鿴 BatchStatus ö¾ÙÀ࣬ºóÃæÓÐ¶ÔÆä״̬½øÐнéÉÜ¡£

2. Job

ÎÒÃÇÖ´ÐеÄÈÎÎñ£¬¸ÃÈÎÎñ¾ÍÊÇ Job ½Ó¿ÚϵÄʵÏÖÀ࣬ÆäÀàͼÈçÏ£º

AbstractJob µÄÊôÐÔ½éÉÜ£º

¡¤restartable ÊÇ·ñÔÊÐíÖØÅÜ

¡¤name ÈÎÎñÃû

¡¤listener ¼àÌýÆ÷

¡¤jobParametersIncrementer »ñÈ¡ÏÂÒ»¸ö JobParameters ¶ÔÏ󣬯äʵÖÊÊÇ¶Ô JobParameters ÉÏÌí¼ÓÒ»¸ö×ÔÔö»òÕßËæ»úµÄ KV ¶ÔÏó£»

¡¤jobParametersValidator ÊÇ¶Ô JobParameters УÑ飻

¡¤stepHandler Ö´ÐÐ Step µÄÊÊÅäÆ÷¡£

ÏÂÃæµÄ×ÓÀàÊǸù¾Ý Step µÄ×é³É¹æÔò²»Ò»Ñù¡£

¡¤SimpleJob Êǰ´ÕÕ¡°Ë³Ðòʽ¡±Ö´ÐÐ Step¡£

¡¤FlowJob °´ÕÕ¡°Á÷ʽ¡±Ö´ÐÐ Step£¬Æä¾ßÌåÖ´Ðйý³ÌÓÉ Flow ½Ó¿ÚµÄ×ÓÀàÀ´ÊµÏÖ¡£

Ò»¸ö Job µÄÖ´Ðйý³ÌÈçÏ£º

SimpleJob ×ÓÀàµÄ doExecute ·½·¨


protected void doExecute(JobExecution execution) throws JobInterruptedException, JobRestartException,
StartLimitExceededException {
StepExecution stepExecution = null;
for (Step step : steps) {
//±éÀú¼¯ºÏÖеÄstep£¬Í¨¹ýStepHandlerÈ¥Ö´ÐÐStep
stepExecution = handleStep(step, execution);
if (stepExecution.getStatus() != BatchStatus.COMPLETED) {
break;
}
}
if (stepExecution != null) {
//ÉèÖÃÖ´ÐÐÍê״̬ÒÔ¼°Í˳ö״̬
execution.upgradeStatus (stepExecution.getStatus());
execution.setExitStatus (stepExecution.getExitStatus());
}
}

FlowJob ×ÓÀàµÄ doExecute ·½·¨


protected void doExecute (final JobExecution execution) throws JobExecutionException {
try {
JobFlowExecutor executor = new JobFlowExecutor (getJobRepository(),
new SimpleStepHandler (getJobRepository()), execution);
//ͨ¹ýFlowÖ´ÐÐ
executor.updateJobExecutionStatus (flow.start(executor).getStatus());
}
catch (FlowExecutionException e) {
if (e.getCause() instanceof JobExecutionException) {
throw (JobExecutionException) e.getCause();
}
throw new JobExecutionException ("Flow execution ended unexpectedly", e);
}
}

2.1 JobExecution

´Ó SimpleLauncher Á÷³ÌͼÖÐÒÔ¼° Job µÄÁ÷³ÌͼÖУ¬Ò»Ö±¶¼ÓÐ JobExecution Ó°×Ó´æÔÚ£»JobExecution ÊǼǼ Job Ö´Ðйý³ÌÖеÄÐÅÏ¢£»JobExecution ÀຬÓеĹؼüÊôÐÔÈçÏ£º

¡¤JobParameters ¼Ç¼ Job ¿ªÊ¼ÔËÐÐʱ´«µÝ¹ýÀ´µÄ²ÎÊý

¡¤stepExecutions ¼Ç¼ Job ÖÐÿ¸ö Step µÄÔËÐйý³ÌÖеÄÐÅÏ¢

¡¤status ¼Ç¼ Job ÔËÐеÄ״̬

COMPLETED -0-Íê³É״̬

STARTING -1-¿ªÊ¼ÖÐ״̬£¬´´½¨ JobExecution ÒÔ¼° StepExecution µÄĬÈÏ״̬

STARTED -2-ÒÑ¿ªÊ¼×´Ì¬

STOPPING -3-Í£Ö¹ÖÐ״̬

STOPPED -4-ÒÑֹͣ״̬£¬Ö÷ÒªÊÇ JobInterruptedException Òì³£

FAILED -5-ʧ°Ü״̬

ABANDONED -6-ÖжÏ״̬

UNKNOWN -7-δ֪״̬£¬Ö÷ÒªÊÇϵͳÒì³££¬¶¼¹éΪδ֪Òì³£

¡¤startTime ÈÎÎñ¿ªÊ¼Ê±¼ä

¡¤createTime JobExecution µÄ´´½¨Ê±¼ä

¡¤endTime ÈÎÎñ½áÊøÊ±¼ä

¡¤lastUpdate ÉÏÒ»´Î¸üÐÂʱ¼ä

¡¤exitStatus ÈÎÎñÍ˳öµÄ״̬£¬batch ÌṩÁËĬÈϵö״̬

EXECUTING -1-Ö´ÐÐÖÐ״̬

COMPLETED -2-Íê³É״̬

NOOP -3-ÈÎÎñδ×öÈκδ¦Àí״̬

STOPPED -4-ֹͣ״̬£¬Ö÷ÒªÊÇ JobInterruptedException ÖжÏÒì³££¬Ê¹ÆäÍ£Ö¹

NO_SUCH_JOB £¬ ûÓжÔÓ¦µÄÈÎÎñÒì³££¬Ö÷ÒªÊǶÔÓÚ NoSuchJobException Òì³£

FAILED -5-ʧ°Ü״̬

UNKNOWN -6-δ֪״̬£¬ÊÇ JobExecution µÄĬÈÏ״̬£¬Ö÷ÒªÊÇϵͳÒì³££¬¶¼¹éΪδ֪Òì³£¡£

¡¤executionContext ÈÎÎñÖ´Ðйý³ÌµÄÉÏÏÂÎÄ£¬Ö÷ÒªÓÃÓÚ²ÎÊýµÄ´«µÝ¡£

¡¤failureExceptions ±£´æÈÎÎñÖ´ÐÐÒì³£¶ÑÕ»ÐÅÏ¢

2.2 JobExecutionListener

Job Ö´Ðйý³ÌÖÐÌṩÁ˼àÌýÆ÷£¬±©Â¶µÄÁ½¸ö½Ó¿Ú£º

public interface JobExecutionListener {
void beforeJob(JobExecution jobExecution);
void afterJob(JobExecution jobExecution);
}

ÆäʵÖʲ¢²»ÊǼàÌýÆ÷£¬¿ÉÒÔÀí½âΪǰºóÖô¦ÀíÆ÷£¬Í¨¹ý¶Ô JobExecution µÄÐ޸쬴ӶøÓ°Ïì¶Ô Job ÔÚÖ´Ðйý³ÌÖеÄÐÐΪ£»

3. Step

ÔÚ½²½â Step ֮ǰ£¬ÐèÒª¶ÔÆä StepHandler ½Ó¿Ú½øÐнâ¶Á£¬ÒòΪ Job ²¢²»ÊÇÖ±½Óµ÷Óà Step µÄʵÏÖÀàµÄ£¬¶øÊÇͨ¹ý StepHandler µÄʵÏÖÀàÈ¥µ÷Óà Step µÄʵÏÖÀàµÄ£»»»¾ä»°Ëµ£¬StepHandler ¾ÍÊÇÒ»¸ö Job Óë Step Ö®¼äµÄÇÅÁº£¬³äµ±ÊÊÅäÆ÷¡£

3.1 StepHandler

StepHandler ½Ó¿ÚµÄʵÏÖÀ࣬Ö÷ÒªÊÇ SimpleStepHandler¡£ÆäÈë¿ÚÊÇ handleStep ·½·¨£¬²éÔÄÆä´úÂ룬´óÌåµÃ³öÆäÁ÷³ÌͼÈçÏ£º

ÕûÌå¶øÑԵϰ£¬Ö÷Òª·ÖΪһϳ¡¾°£º

Èç¹ûÉÏÒ»¸öÈÎÎñ¶ÔÓ¦µÄ Step Ö´Ðгɹ¦

3.2 Step ½Ó¿Ú¼°ÊµÏÖÀà

Step ½Ó¿ÚµÄ³éÏóÀà AbstractStep ÊÇÖ÷ÒªµÄ Step Ö´ÐеÄÖ÷ÒªÈë¿Ú£¬½Ó×ÅÀïÃæ»áµ÷ÓöÔÓ¦×ÓÀàËùÓеÄÌØÐÔ·½·¨ doExecute·½·¨£»¾ßÌåÁ÷³ÌͼÈçÏ£º

ÉÏÃæµÄÁ÷³Ìͼ£¬ÖØµã¹Ø×¢µÄ״̬ÒÔ¼°Í˳ö״̬µÄÉèÖÃ

3.2.1 StepExecution

¡¤jobExecution ¸Ã Step Ëù¹éÊôµÄ Job ¶ÔÓ¦µÄÖ´ÐÐʵÀý

¡¤stepName Ãû³Æ

¡¤status ÔËÐÐ״̬

COMPLETED -0-Íê³É״̬

STARTING -1-¿ªÊ¼ÖÐ״̬£¬´´½¨ JobExecution ÒÔ¼° StepExecution µÄĬÈÏ״̬

STARTED -2-ÒÑ¿ªÊ¼×´Ì¬

STOPPING -3-Í£Ö¹ÖÐ״̬

STOPPED -4-ÒÑֹͣ״̬£¬Ö÷ÒªÊÇ JobInterruptedException Òì³£

FAILED -5-ʧ°Ü״̬

ABANDONED -6-ÖжÏ״̬

UNKNOWN -7-δ֪״̬£¬Ö÷ÒªÊÇϵͳÒì³££¬¶¼¹éΪδ֪Òì³£

¡¤readCount ¶Á´ÎÊýµÄͳ¼Æ

¡¤writeCount д´ÎÊýµÄͳ¼Æ

¡¤commitCount Ìá½»´ÎÊýµÄͳ¼Æ

¡¤rollbackCount »Ø¹ö´ÎÊýµÄͳ¼Æ

¡¤readSkipCount Ìø¹ý¶Á´ÎÊýµÄͳ¼Æ

¡¤processSkipCount Ìø¹ý´¦Àí´ÎÊýµÄͳ¼Æ

¡¤writeSkipCount Ìø¹ýдÈë´ÎÊýµÄͳ¼Æ

¡¤startTime ´´½¨ StepExecution µÄʱ¼ä

¡¤endTime ½áÊøÊ±¼ä

¡¤lastUpdated ÉÏÒ»´Î¸üÐÂʱ¼ä

¡¤executionContext step Ö´ÐÐÉÏÏÂÎÄ

¡¤exitStatus Í˳ö״̬

EXECUTING -1-Ö´ÐÐÖÐ״̬

COMPLETED -2-Íê³É״̬

NOOP -3-ÈÎÎñδ×öÈκδ¦Àí״̬£¬

STOPPED -4-ֹͣ״̬£¬Ö÷ÒªÊÇ JobInterruptedException ÖжÏÒì³££¬Ê¹ÆäÍ£Ö¹

FAILED -5-ʧ°Ü״̬

UNKNOWN -6-δ֪״̬£¬ÊÇ JobExecution µÄĬÈÏ״̬£¬Ö÷ÒªÊÇϵͳÒì³££¬¶¼¹éΪδ֪Òì³£¡£

¡¤terminateOnly ÊÇ·ñÖжϱêÖ¾

¡¤filterCount ¹ýÂË´ÎÊýµÄͳ¼Æ

¡¤failureExceptions Òì³£¶ÑÕ»ÐÅÏ¢

3.2.2 AbstractStep µÄ×ÓÀà

ÀàͼÈçÏ£º

¡¤PartitionStep

ÊÇÓйؽ«ÈÎÎñ Step ½øÐвð·Ö´¦ÀíµÄʵÀý£¬¾ßÌå½»ÓÉÆäÊôÐÔ³ÉÔ±½øÐд¦Àí£¬¸ÃÀàÏ൱ÓÚÊÇÒ»¸öÃÅÃæ¶ÔÏó¡£

¿´µ½ PartitionStep Öаüº¬ÁËÈý¸ö¹Ø¼üµÄÊôÐÔ³ÉÔ±£¬¾ßÌ幤×÷Êǽ»¸øÆä³ÉÔ±Íê³ÉµÄ£»

stepExecutionSplitter ½«µ±Ç° Step ²ð·Ö¶à¸ö Step£¬ÆäÔ­ÀíÊÇ»ùÓÚµ±Ç° StepExecution ¶ÔÏ󣬴´½¨¶à¸ö×Ó StepExecution ¶ÔÏó£»

partitionHandler Êǽ« stepExecutionSplitter ²ð·ÖºóµÄ×Ó StepExecution ¼¯ºÏ½øÐÐÖ´ÐУ¬ÎÒÃÇ¿ÉÒÔÈçÏÂÀàͼ£¬ÔÚ TaskExecutionParitionHandler Öаüº¬ÁËÒ»¸ö Step ÊôÐÔ£¬Òâζ×Ŷà´ÎÖ´ÐÐÊôÐÔ step ¶ÔÏóµÄ¶¯×÷µÄ¡£

stepExecutionAggregator Êǽ« partitionHandler Ö´ÐÐÍêµÄ½á¹û½øÐй鼯£»

ÔÚ spring-batch ÖÐÌṩÁËĬÈϵÄʵÏÖÀ࣬µ«ÎÒÃÇ¿ÉÒÔÍØÕ¹£¬¿ÉÒÔÓÐЧµÄÌṩÅúÊý¾ÝµÄ´¦ÀíЧÂÊ¡£ÀýÈ磬²ÉÓÃÔ¶³Ì·ÖƬ£¬Èçͨ¹ý½Ó¿ÚÐÎʽ£¬ÏûÏ¢Öмä¼þÐÎʽµÈ·½Ê½¡£¾ßÌåµÄ×ö·¨ÊÇʵÏÖ PartitionHandler ½Ó¿Ú¡£

¡¤TaskletStep

Ö´ÐÐ Tasklet ½Ó¿ÚµÄÈÎÎñ Step¡£ÔÚÎÒÃdz£¹æ¿ª·¢ÖУ¬Ö÷ÒªÊÇʹÓõľÍÊǸÃÀࣻÔÚ spring batch ¿ò¼Ü£¬TaskletStep ÊÇÖØµã£¬¶øÇÒÒ²ÊǽÏΪ¸´Ôӵģ»ºóÃæ³é³öÀ´½øÐнâ¶Á£»ÎÒÃÇÏÈ¿´Ò»ÏÂÆäÊôÐÔ£º

stepOperations ÖØ¸´²Ù×÷¶ÔÏó£¬Òâζ×Å£¬Tasklet ²»ÊÇÒ»´ÎÐÔ´¦ÀíËùÓÐÊý¾Ý£¬¶øÊÇ·ÖÅú´Î½øÐд¦ÀíµÄ£»

chunkListener ¼àÌýÆ÷£¬´¦Àí¹ý³ÌÖÐËù´¥·¢µÄʼþ

interruptionPolicy ÖжϲßÂÔ£¬ ÿ´ÎÑ­»·£¬¶¼ÒªÈ¥¼ì²âÊÇ·ñÒѾ­´¥·¢ÁËÖжϣ»

stream Á÷²Ù×÷£¬ Ö÷ÒªÊÇÖ´Ðйý³ÌÖдò¿ª£¬¸üС¢¹Ø±ÕÁ÷¶ÔÓ¦µÄ¾ä±ú£»

transactionManager ÊÂÎñ¹ÜÀíÆ÷

transactionAttribute ÊÂÎñÊôÐÔ

tasklet Ö´ÐÐÊý¾Ý´¦ÀíµÄ¶ÔÏó£»

¡¤DecisionStep

ÊǾö²ß·ÓɵÄÈÎÎñ step£¬µÃÅäºÏ Flow ²ÅÄÜÆðµ½Ð§¹û£»ÔÚ Flow ÖÐÊǸù¾Ý step µÄÍ˳ö״̬ ExitStatus À´½øÐзÓɵ컏ÃÀàµÃʵÏÖ Decider ½Ó¿Ú¡£

¡¤JobStep

Ö´ÐÐ×Ó Job µÄÈÎÎñ Step

¡¤FlowStep

Ö´ÐÐ Flow µÄÈÎÎñ Step

ÔÚÎÒÃÇ´úÂ뿪·¢ÖУ¬Ö÷ÒªÊÇÎ§ÈÆ×Å TaskletStep ÒÔ¼° PartitionStep ½øÐÐÊý¾Ý´¦ÀíµÄ£»

3.3 StepListener

ÀàͼÈçÏ£º

ÔÚ AbstractStep Ö´Ðйý³Ì£¬Ö÷Òª´¥·¢µÄ StepExecutionListener

ÆäÓàµÄ¼àÌýÆ÷£¬¶¼ÊÇ Tasklet ½Ó¿ÚµÄ×ÓÀàËù´¥·¢µÄ£»ºóÃæ¶Ô Tasklet ½Ó¿Ú½â¶Áʱ£¬½øÐÐ˵Ã÷£»

4. TaskletStep

ÎÒÃÇÏÈ¿´ TaskletStep µÄ´¦ÀíÂß¼­£»

protected void doExecute (StepExecution stepExecution) throws Exception {
stepExecution.getExecutionContext( ).put (TASKLET_TYPE_KEY, tasklet.getClass().getName());
stepExecution.getExecutionContext( ).put(STEP_TYPE_KEY, this.getClass().getName());
//Á÷¸üвÙ×÷
stream.update( stepExecution.getExecutionContext( ));
getJobRepository( ).updateExecutionContext (stepExecution);
//´´½¨ÐźÅËø
final Semaphore semaphore = createSemaphore();
//¶Ôµ±Ç°Êý¾Ý´¦ÀíÈÎÎñ½øÐвð·ÖÊý¾Ý
stepOperations.iterate (new StepContextRepeatCallback (stepExecution) {
@Override
public RepeatStatus doInChunkContext (RepeatContext repeatContext, ChunkContext chunkContext)
throws Exception {
StepExecution stepExecution = chunkContext.getStepContext( ).getStepExecution();
// Öжϼì²â
interruptionPolicy.checkInterrupted (stepExecution);
RepeatStatus result;
try {
//ChunkTransactionCallback ÊÇTaskletStepÄÚ²¿À࣬ÔÚÖ´ÐÐChunkTransactionCallbackʱ£¬
//¾ßÌåÊǽ»ÓÉTaskletʵÀýÈ¥½øÐÐÊý¾Ý´¦Àí£»
result = new TransactionTemplate (transactionManager, transactionAttribute)
.execute(new ChunkTransactionCallback (chunkContext, semaphore));
}
catch (UncheckedTransactionException e) {
// Allow checked exceptions to be thrown inside callback
throw (Exception) e.getCause();
}

chunkListener.afterChunk(chunkContext);
// Öжϼì²â
interruptionPolicy.checkInterrupted (stepExecution);
return result == null ? RepeatStatus.FINISHED : result;
}
});
}

4.1 RepeatOperations

ÀàͼÈçÉÏ£¬¼ÈÈ» RepeatOperations ÊÇÖØ¸´²Ù×÷ʵÀý£¬¸ÃʵÏÖÀà¾ÍÐèÒªÓÐÒ»ÖÖ»úÖÆ£¬¼ì²âÊÇ·ñÒѾ­Íê³É£»ÎÒÃÇ¿´µ½ RepeatTemplate ÀàÖÐÓÐ CompletionPolicy ÊôÐÔ£¬ÊǼì²âÊý¾Ý´¦ÀíÊÇ·ñÍê³É£»Èç¹ûÔÚÑ­»·´¦ÀíÖУ¬ÆäÖÐÓÐÒ»¸öÑ­»·³öÏÖÁËÎÊÌ⣬ÐèÒªÈçºÎ´¦Àí¸ÃÒì³££¬ÊÇÍ£Ö¹Êý¾Ý´¦Àí£¬ÏòÉÏÅ׳öÒì³££»»¹ÊǼòµ¥µÄ´òÓ¡Òì³££¬¼ÌÐøÏÂÒ»´ÎÑ­»·´¦Àí£»

ÎÒÃÇ¿´µ½ TaskExecutionRepeatTemplate ÀàÖÐÓÐ TaskEsecutor ÊôÐÔ£¬Òâζ¿ÉÒÔ²ÉÓÃÒì²½µÄÐÎʽ½øÐÐÊý¾Ý´¦Àí£»

ÎÒÃDz鿴Æä¹Ø¼üµÄ´úÂ룬Á÷³ÌͼÈçÏ£º

ÉÏÃæµÄÁ÷³Ìͼ±È½Ï´Ö²Ú£¬´óÌåÂÞÁÐÁ˺ËÐĵÄÂß¼­£¬Ï¸½ÚµÄÐèÒª¾ßÌå²é¿´´úÂ룻

¾ßÌåÍê³É²ßÂԵ쬾ßÌå²é¿´ÆäʵÏÖÀࣻÕâÀï²»ÔÚÂÞÁУ»

4.2 Tasklet

Tasklet ½Ó¿ÚµÄÖ÷ÒªµÄʵÏÖÀàΪ ChunkOrientedTasklet£¬ÆäÀàͼÈçÏ£º

Æä¹Ø¼üµÄÊôÐÔ£º

¡¤chunkProcessor ¶ÔÊý¾Ý½øÐд¦ÀíµÄ½Ó¿Ú£¬ÆäʵÏÖÀàÖаüº¬µÄÖ÷ÒªµÄ½Ó¿ÚΪ ItemProcessor ºÍ ItemWriter¡£

ItemProcessor ÊÇ¶Ô ItemReader »ñÈ¡µÄÊý¾Ý½øÐд¦Àí

ItemWriter ÊÇ¶Ô ItemProcessor ´¦ÀíºóµÄÊý¾Ý½øÐÐдÈë²Ù×÷

¡¤ChunkProvider ÌṩÊý¾ÝµÄ½Ó¿Ú£¬ÆäʵÏÖÀàÖаüº¬µÄÖ÷ÒªµÄ½Ó¿ÚΪ ItemReader¡£

ItemReader ÊÇÌṩÊý¾ÝµÄ½Ó¿Ú

¡¤chunkListener ¶Ô Chunk ½øÐмàÌý£»

Á÷³ÌͼÈçÏ£º

ÉÏÃæÖ»ÊÇ´Ö²ÚµÄÂÞÁеÄÖ÷ÒªµÄºËÐÄÁ÷³Ìͼ£¬¸ÃÁ÷³Ìͼ²¢Î´°üº¬ FaultTolerantChunkProcessor ÀàµÄÂß¼­£»

¡¤FaultTolerantChunkProcessor Ö÷ÒªÊÇÈÝ´íÐÔ´¦Àí£¬ÈçÖ´ÐÐʧ°Üʱ½øÐÐÖØÊÔ£¬ÖØÊÔÒÀȻʧ°Ü£¬ÔòÖ´ÐжÔÓ¦»Øµ÷´¦Àí£»Ä¿Ç°Ã»ÓÐ¶ÔÆä½øÐйý¶àÏêϸ½â¶Á£»ÓÐÐèÒª£¬¿ÉÒÔÖØµãÈ¥²éÔĸôúÂ룻

ItemReader¡¢ItemProcessor ºÍ ItemWriter ÕâÈý¸ö½Ó¿Ú£¬ÌṩÁ˸ü¼ÓÁé»îµÄÉèÖá£Èç¿ÉÒÔͨ¹ýÔ¶³ÌµÄÐÎʽȥ»ñÈ¡£¬´¦Àí£¬Ð´ÈëµÈ²Ù×÷£»

ÔÚ batch ¿ò¼ÜÖУ¬ÌṩÁ˺ܶàÓÐ¹Ø ItemReader£¬ItemProcessor ºÍ ItemWriter ½Ó¿ÚµÄʵÏÖÀࣻ¿ÉÒÔÓÐЧµÄ¼õÉÙ¿ª·¢ÈËÔ±µÄ¹¤×÷Á¿£»ÎÒÃǾßÌåÂÞÁÐÎÒÃdz£ÓõÄʵÏÖÀà¡£Ö÷ÒªÊÇÎļþ½âÎö£¬ÒÔ¼°Êý¾Ý¿â²Ù×÷µÈ£»

¡¤FlatFileItemReader »ùÓÚÎļþ½âÎöµÄ£¬°´ÕÕÐнøÐнâÎöµÄ£¬½âÎö¹æÔò½»¸ø LineMapper ½øÐд¦Àí£»

¡¤AbstractPagingItemReader »ùÓÚ·ÖÒ³ÐÎʽ½øÐлñÈ¡Êý¾Ý£¬ÆäʵÏÖÀà´ó¶àÊý¶¼ÊÇÊý¾Ý¿â²éѯ£»ÏÂÃæÂÞÁÐÁË JDBC ²ãµÄ·ÖÒ³²éѯ£»

µ±È»»¹Óкܶà ItemReader µÄʵÏÖÀ࣬ÀýÈçÏûÏ¢¼äµÄ JmsItemReader£¬KafkaItemReader µÈ

ItemWriter Ò²¶ÔÓ¦ÓÐÎļþÒÔ¼°Êý¾Ý¿â²ãÃæÉϵÄдÈë²Ù×÷£¬ÀàͼÈçÏ£º

5. Flow

Ïà¹ØÀàͼÈçÏ£º

Flow ½Ó¿ÚµÄʵÏÖÀàΪ SimpleFlow£¬Ö÷ÒªµÄ×é³É½Ó¿ÚÓÐ StateTransition Á¬½ÓÆðÀ´¡£¶ø StateTransition ÖÐµÄ State ½Ó¿Ú£¬ÆäÓкܶàʵÏÖÀ࣬ÀàͼÈçÏ£º

´ÓÉÏÀàͼÀ´¿´£¬Òâζ×Å Flow ¿ÉÒÔ½« Step ºÍ×Ó Flow ×éºÏ³ÉÁ´Â·ÆðÀ´£¬ÒÔ¼°¾ö²ß DecisionState À´¾ö¶¨½«ÒªÖ´ÐеÄÏÂÒ»¸ö State¡£ÎÒÃǾßÌ忴һϡ°Á´±í¡°ÊÇÈçºÎ¹¤×÷µÄ£¿´óÌåµÄÁ÷³ÌͼÈçÏ£º

¼òµ¥À´½²£¬ÆäÊÇͨ¹ý FlowExecutionStatus À´¾ö¶¨Ö´ÐÐÄÄÒ»¸ö½ÚµãµÄ£¬ÔÚ batch ÖÐÌṩÁËĬÈϵÄ״̬£»

¡¤COMPLETED Íê³É״̬

¡¤STOPPED ֹͣ״̬

¡¤FAILED ʧ°Ü״̬

¡¤UNKNOWN λÖÃ״̬

µ«ÊÇÎÒÃÇÒÀÈ»¿ÉÒÔÍØÕ¹Æä״̬£¬À´¾ö¶¨Æ¥Åäµ½ÏÂÒ»¸ö½ÚµãµÄÖ´ÐÐÅжϣ»

6. JobRepository ¼° Entity

ÔÚ batch Öлá¼Ç¼¸÷¸ö Job ÒÔ¼° Step µÄÖ´ÐÐÇé¿ö£¬ÆäÏà¶ÔÓ¦µÄÌṩµÄÖ÷ÒªµÄ½Ó¿ÚΪ JobRepository£¬ÆäÀàͼÈçÏ£º

ÔÚ SimpleJobRepository °üº¬ÀïËĸö dao ²Ù×÷£¬Æä¶¼ÊÇÒÔ½Ó¿ÚµÄÐÎʽ±©Â¶³öÀ´£»¾ßÌå½»ÓÉ¿ª·¢ÈËÔ±Ö¸¶¨£¬ÊÇÒÔÄÚ´æÐÎʽ²Ù×÷£¬»¹ÊÇÊý¾Ý¿âÐÎʽ²Ù×÷£»ÕâÀﻹÓÐһЩÂß¼­£¬ÕâÀï²»ÔÚ½øÐнâ¶Á£¬¾ßÌå²é¿´Æä´úÂ룻

ÿ¸ö Job ÒÔ¼° Step ÔÚÖ´ÐÐÖж¼»á´´½¨Ò»¸öÖ´ÐÐʵÀý Execution ¶ÔÏó£¬À´¼Ç¼Æä¹ý³ÌÐÅÏ¢£¬ÀàͼÈçÏ£º

7. JobOperator

ÉÏÃæÂÞÁÐÁËÓÐ¹Ø Job µÄÔËÐйý³ÌµÄ´óÌåÂß¼­£»²¢Ã»ÓÐ¶ÔÆä½øÐйÜÀí£»

ÔÚ spring-batch ¿ò¼ÜÌṩÁËÕâÑùµÄÒ»¸ö½Ó¿Ú JobOperator£¬¿ÉÒÔ¶ÔÆä½øÐйÜÀí£»

ÎÒÃÇÖØµã¹Ø×¢ÆäÖм¸¸ö·½·¨£¬·½·¨ÈçÏ£º

public interface JobOperator {

//¿ªÆôÈÎÎñÖ´ÐÐ
Long start(String jobName, String parameters) throws NoSuchJobException, JobInstanceAlreadyExistsException, JobParametersInvalidException;

//ÖØÐÂÆô¶¯ÈÎÎñ
Long restart(long executionId) throws JobInstanceAlreadyCompleteException, NoSuchJobExecutionException,
NoSuchJobException, JobRestartException, JobParametersInvalidException;

//Í£Ö¹ÈÎÎñµÄÖ´ÐÐ
boolean stop(long executionId) throws NoSuchJobExecutionException, JobExecutionNotRunningException;

//ÖжÏÈÎÎñµÄÖ´ÐÐ
JobExecution abandon (long jobExecutionId) throws NoSuchJobExecutionException, JobExecutionAlreadyRunningException;
}

8. ×ܽá

ÉÏÃæ´óÌåÂÞÁÐÁË batch ÖÐËùÉæ¼°µÄ¸ÅÄîÒÔ¼°¶ÔÓ¦µÄÀàͼ£¬´ÖÂÔµÄÁ÷³Ìͼ£»

¿ÉÄÜ¿´×ÅÓÐµã±»ÈÆÔÎÁË£¬µ«Ö»ÒªÎ§ÈÆ Job µÄ״̬ÒÔ¼° Step ״̬½øÐв鿴Æä¹ý³Ì£¬µ«ÎÒÊáÀíÁ˺ܾÃÒÀÈ»ÎÞ·¨È·ÈÏÆä״̬¼äÇл»µÄ׼ȷÂß¼­£¬Óе㸴ÔÓ£»µ«ÎÒÃÇ¿ÉÒÔ²»ÓÃ¹ÜÆä״̬¼äÇл»£¬ÒòΪÒÀÈ»ÓÐÒì³£Å׳ö£¬Æä»á¼Ç¼¶ÑÕ»ÐÅÏ¢£¬ÎÒÃÇÈ¥²é¿´Æä¶ÑÕ»ÐÅÏ¢¼´¿É£»

Step Ö®¼äÊÇÈçºÎ´«²ÎµÄ£¬Õâ¸öÐèÒªÖØµãÖ¸³ö£»Ã¿¸ö Step Ö´Ðж¼»á´´½¨ StepExecution ¶ÔÏ󣬸öÔÏóÖÐµÄ ExecutionContext ÊÇÖ»»áÔÚ Step ÄÚ²¿Ê¹Ó㬲¢²»»á´«µÝ¸øÏÂÒ»¸ö Step£»µ« StepExecution ¶ÔÏóÖаüº¬ JobExecution ¶ÔÏó£¬ÎÒÃÇ¿ÉÒÔ¶Ô JobExecution ¶ÔÏóÖÐµÄ ExecutionContext ¶ÔÏó½øÐÐÉèÖã¬ÕâÑù×Ó¿ÉÒÔµ½ÏÂÒ»¸ö StepExecution ¿ÉÒÔÄõ½ÏëÒªµÄ²ÎÊý£»

ÁíÍâÍê³É²ßÂÔ½Ó¿Ú CompletionPolicy£¬¿ÉÒÔ¾ßÌå²éÔĶÔӦʵÏÖÀ࣬ÒÔ¼°ÔÚÆäËûÀàÖÐʹÓõĶÔÓ¦µÄʵÏÖÀࣻÏàÐÅ»áºÜ¿ì°ÑÎÕÆäÂß¼­ÐÅÏ¢£»

Èý. ¹¹½¨

ÉÏÃæÂÞÁÐÁ˹ؼüµÄÀ࣬ÄÇô¾ßÌåÊÇÈçºÎ´´½¨ÕâЩÀàµÄ£»

3.1 Job ¹¹½¨

Job ¹¹½¨Í¨¹ý JobBuilderHelper µÄ×ÓÀàÒÔ¼° FlowBuilder ½øÐй¹½¨£»ÀàͼÈçÏ£»

3.2 Step ¹¹½¨

Step ¹¹½¨Í¨¹ý StepBuilderHelper µÄ×ÓÀà½øÐй¹½¨£¬ÀàͼÈçÏ£º

ÅäÖà JobRepository ͨ¹ý AbstractJobRepositoryFactoryBean ³éÏóÖÐ×ÓÀà½øÐй¹½¨£¬Ààͼ¾Í²»Õ¹Ê¾£»

3.3 JobRepository ¹¹½¨

Ïà¹ØÊôÐÔ³ÉÔ±µÄ½éÉÜ£¬´ýºóÐø½øÐв¹³ä£»

3.4 ×ܽá

ÏàÐÅ£¬Í¨¹ýÉÏÊöµÄ¹¹½¨µÄÏà¹ØÀà½á¹¹½øÐÐչʾ£¬ÏàÐŶÔÕû¸ö spring-batch ¿ò¼ÜµÄʹÓÃÒÔ¼°ÈçºÎ¹¹½¨Óдó¸ÅµÄÁ˽⣻

 
   
2197 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
 
×îÐÂÎÄÕÂ
JavaÐéÄâ»ú¼Ü¹¹
JVM¡ª¡ªJavaÐéÄâ»ú¼Ü¹¹
JavaÈÝÆ÷Ïê½â
Java½ø½×--ÉîÈëÀí½âArrayListʵÏÖÔ­Àí
Java²¢·¢ÈÝÆ÷£¬µ×²ãÔ­ÀíÉîÈë·ÖÎö
×îпγÌ
java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
SpringBoot&Cloud¡¢JavaSSM¿ò¼Ü
Spring Boot Åàѵ
³É¹¦°¸Àý
¹úÄÚÖªÃûÒøÐÐ Spring+SpringBoot+Cloud+MVC
±±¾© Java±à³Ì»ù´¡ÓëÍøÒ³¿ª·¢»ù´¡
±±¾© Struts+Spring
»ªÏÄ»ù½ð ActiveMQ Ô­Àí
ijÃñº½¹« Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢