Spring Batch 整理

什么是Spring Batch

Spring Batch 作为 Spring的子项目,是一款基于 Spring的企业批处理框架。通过它可以构建出健壮的企业批处理应用。Spring Batch不仅提供了统一的读写接口、丰富的任务处理方式、灵活的事务管理及并发处理,同时还支持日志、监控、任务重启与跳过等特性,大大简化了批处理应用开发,将开发人员从复杂的任务配置管理过程中解放出来,使他们可以更多地去关注核心的业务处理过程。

另外我们还需要知道,Spring Batch是一款批处理应用框架,不是调度框架。它只关注批处理任务相关的问题,如事务、并发、监控、执行等,并不提供相应的调度功能。因此,如果我们希望批处理任务定期执行,可结合 Quartz等成熟的调度框架实现。

 

Spring Batch 还针对读、写操作提供了多种实现,如消息、文件、数据库。对于数据库,还提供了 HibernateiBatisJPA等常见 ORM框架的读、写接口支持。

所有 Spring Batch的读操作均需要实现 ItemReader接口,而且 Spring Batch为我们提供了多种默认实现,尤其是基于 ORM框架的读接口,同时支持基于游标和分页两类操作。因此,多数情况下我们并不需要手动编写ItemReader类,而是直接使用相应实现类即可


上图描绘了Spring Batch的执行过程。说明如下:

   每个Batch都会包含一个JobJob就像一个容器,这个容器里装了若干StepBatch中实际干活的也就是这些Step,至于Step干什么活,无外乎读取数据,处理数据,然后将这些数据存储起来(ItemReader用来读取数据,ItemProcessor用来处理数据,ItemWriter用来写数据)JobLauncher用来启动JobJobRepository是上述处理提供的一种持久化机制,它为JobLauncherJob,和Step实例提供CRUD操作。

   外部控制器调用JobLauncher启动一个JobJob调用自己的Step去实现对数据的操作,Step处理完成后,再将处理结果一步步返回给上一层,这就是Batch处理实现的一个简单流程。





DB或是文件中取出数据的时候,read()操作每次只读取一条记录,之后将读取的这条数据传递给processor(item)处理,框架将重复做这两步操作,直到读取记录的件数达到batch配置信息中commin-interval设定值的时候,就会调用一次write操作。然后再重复上图的处理,直到处理完所有的数据。当这个Step的工作完成以后,或是跳到其他Step,或是结束处理

     这就是一个SpringBatch的基本工作流程。


HelloWorld



   

    
        
            
        
        
            
        
    

    
        
    

    
        
    
    
    
			
		

		


		
    
    	
    
    	
		
	
    
    


 
   

多个processor

多个processor

        
            
                
                
            
        
        
    


    
    
        
        	
        	
            
        
    
	


 
   
 
  

文件读写

CsvItemProcessor 实现了 ItemProcessor 接口,其中类型 I 表示传递给处理器的对象类型, O 则表示处理器返回的对象类型

 
   

        
            
                
                
            
        
        
    
    
    
    
    
    
        
        	
        	
            
        
    
		
    
    
    
    
    
        
        
        
        
            
                
                
                    
                        
                    
                
            
        
    

    

    
    
        
        
            
                pname
                pid
                age
                birthday
            
        
    
    
    
    
    
        
        
            
                
                
                    
                        
                    
                
            
        
    


 
   
 
  

处理类CsvItemProcessor

public class CsvItemProcessor implements ItemProcessor {

	@Override
	public Person process(Person person) throws Exception {
		System.out.println("------------------------");
		System.out.println(person.getPname());
		person.setPname(person.getPname() + "~");
        return person;
	}

}


多个processor


        
            
                
                
            
        
        
    


    
    
        
        	
        	
            
        
    
	


操作数据库

@Component("WriteIntoDB")
public class WriteIntoDB implements ItemProcessor{
	@Resource(name="personDao")
	public IPersonDao dao ; 
	
	@Override
	public Person process(Person item) throws Exception {
		System.out.println("******************");
		System.out.println(item.getPname() + item.getBirthday()); 
		dao.insertPerson(item);
		System.out.println("insert success");
		return item;
	}

}


skip的介绍

在实际的项目开发中,我们常常要将几十万甚至上百万的数据从文件导入到DB中,如果其中某条数据导入时发生例外,我们并不想整个Job以失败而结束,而是希望能将错误的数据经过处理后保存起来,其余正确的数据继续做导入处理。如果遇到这样的场景,SpringBatchskip机制就可以派上用场了。顾名思义,skip的作用就是跳过某些数据(例如错误数据) 



 2         
 3             
 4                 
 6                     
 7                         
 8                     
 9                 
10             
11         
12     








你可能感兴趣的:(Spring,Batch)