Step之间传递数据

Step之间传递数据有两种方式:

一、

通过step_execution 或者 job_execution来在不同step中传递数据.但是如果数据量大的话,这将不是一种好的方式.因为spring batch默认会通过job repository将 setp_execution和job_execution进行持久化。 如果把要传递的数据放在setp_execution或者job_execution中进行传递,job repository会把数据持久化到数据库的日志表中,对于大量数据不适合。

二、

创建一个bean,通过bean来传递数据,假设step1中放入的数据,从step2中得到

1、创建一个bean,用于传递数据

@Component
public class Users {

	private List<User> listUsers = new ArrayList<User>();

	public List<User> getListUsers() {
		return listUsers;
	}

	public void setListUsers(List<User> listUsers) {
		this.listUsers = listUsers;
	}
}

2、创建step1,放入数据

@Component
public class StepDemo1 implements Tasklet{

	@Autowired
	private Users users;
	
	@Override
	public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
		List<User> listUsers = new ArrayList<>();
		User user1 = new User(1, "zhangsan", 20);
		User user2 = new User(2, "lisi", 25);
		User user3 = new User(3, "wanger", 30);
		listUsers.add(user1);
		listUsers.add(user2);
		listUsers.add(user3);
		users.setListUsers(listUsers);
		return RepeatStatus.FINISHED;
	}
}

3、创建step2,用于取出数据

@Component
public class StepDemo2 implements Tasklet{

	/*bean在容器中默认是单例的,所以step2中的users与step1中的users是同一个对象,故里面的数据也是一致的*/
	@Autowired
	private Users users;
	
	@Override
	public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
		List<User> listUsers = users.getListUsers();
		listUsers.forEach((x) -> {System.out.println(x);});
		return RepeatStatus.FINISHED;
	}
}

由于step2与step1中的users bean是共享的,所以数据是一致的。

4、在resource目录下创建application.xml,配置批量

	<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
		<property name="jobRepository" ref="jobRepository" />
	</bean>
	
	<bean id="jobRepository"
		class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
		<property name="dataSource" ref="dataSource-oracle" />
		<property name="transactionManager" ref="transactionManager" />
	</bean>
	
	<!--用真实数据库配置代替-->
	<bean id="dataSource-oracle" class="com.alibaba.druid.pool.DruidDataSource"
		init-method="init" destroy-method="close">
		<property name="url" value="${database.url}" />
		<property name="username" value="${database.user}" />
		<property name="password" value="${database.passwd}" />
		<property name="driverClassName" value="${database.driver}" />
		<property name="validationQuery" value="${database.validationQuery}" />
	</bean>
	
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource-oracle" />
	</bean>
	
	<batch:job id="jobTest">
		<batch:step id="step1" next="step2">
			<batch:tasklet ref="stepDemo1" />
		</batch:step>
		
		<batch:step id="step2">
			<batch:tasklet ref="stepDemo2"></batch:tasklet>
		</batch:step>
	</batch:job>

5、创建测试程序

@EnableBatchProcessing	
@SpringBootApplication
public class BatchDemoApp {

	public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
		Set<Object> set = new HashSet<>();
		set.add("classpath:applicationContext.xml");
		SpringApplication app = new SpringApplication(BatchDemoApp.class);
		app.setSources(set);
		ApplicationContext ctx = app.run(args);
		
		JobLauncher launcher = (JobLauncher) ctx.getBean("jobLauncher");
		Job job = (Job) ctx.getBean("jobTest");
		JobParametersBuilder builder = new JobParametersBuilder().addString("myKey", "myKey_value");
		System.out.println("builder.toJobParameters() : " + builder.toJobParameters());
		JobExecution jobExecution = launcher.run(job, builder.toJobParameters());
		ExitStatus status = jobExecution.getExitStatus();
		if (status.getExitCode().equals(ExitStatus.COMPLETED.getExitCode())) {
			System.out.println("批量成功!");
		}else {
			System.out.println("批量失败!");
		}
	}
}

运行测试程序,在step2中输出如下数据,获得了step1中放入的数据。

User [id=1, name=zhangsan, age=20]
User [id=2, name=lisi, age=25]
User [id=3, name=wanger, age=30]

文章参考: http://lib.csdn.net/article/javaee/3741

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值