媒介
在大型的企业应用中,或多或少城市存在大量的任务需要处理惩罚,如邮件批量通知所有将要逾期的会员等等。而在批量处理惩罚任务的进程中,又需要留意许多细节,如任务异常、机能瓶颈等等。那么,利用一款优秀的框架总比我们本身反复地造轮子要好得多一些。
我地址的物联网云平台部分就有这么一个需求,需要实现批量下发呼吁给百万设备。为了防备枯燥乏味,下面就让我们先通过Spring Batch框架简朴地实现一下这个成果,再来具体地先容这款框架!
小试牛刀
Demo代码:https://github.com/wudashan/spring-batch-demo.git
引入依赖
首先我们需要引入对Spring Batch的依赖,在pom.xml文件插手下面的代码:
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>3.0.8.RELEASE</version>
</dependency>
装载Bean
其次,我们需要在resources目次下,建设applicationContext.xml文件,用于自动注入我们需要的类:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 事务打点器 -->
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
<!-- 任务客栈 -->
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- 任务加载器 -->
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository"/>
</bean>
</beans>
有了上面声明的transactionManager、jobRepository、jobLauncher,我们就可以执行批量任务啦!不外,我们还需要建设一个任务。在Spring Batch框架中,一个任务Job由一个可能多个步调Step,而步调又由读操纵Reader、处理惩罚操纵Processor、写操纵Writer构成,下面我们别离建设它们。
建设Reader
既然是读操纵,那么必定要有能读的数据源,利便起见,我们直接在resources目次下建设一个batch-data.csv文件,内容如下:
1,PENDING 2,PENDING 3,PENDING 4,PENDING 5,PENDING 6,PENDING 7,PENDING 8,PENDING 9,PENDING 10,PENDING
很是简朴,个中第一列代表着呼吁的id,第二列代表着呼吁的当前状态。也就是说,此刻有10条缓存的呼吁,需要下发给设备。
读操纵需要实现ItemReader<T>接口,框架提供了一个现成的实现类FlatFileItemReader。利用该类需要配置Resource和LineMapper。Resource代表着数据源,即我们的batch-data.csv文件;LineMapper则暗示如何将文件的每行数据转成对应的DTO工具。
建设DTO工具
由于我们的数据源是呼吁数据,所以我们需要建设一个DeviceCommand.java文件,代码如下:
public class DeviceCommand {
private String id;
private String status;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
自界说LineMapper
我们需要本身实现一个LineMapper实现类,用于将batch-data.csv文件的每行数据,转成措施利便处理惩罚的DeviceCommand工具。
public class HelloLineMapper implements LineMapper<DeviceCommand> {
@Override
public DeviceCommand mapLine(String line, int lineNumber) throws Exception {
// 逗号支解每一行数据
String[] args = line.split(",");
// 建设DeviceCommand工具
DeviceCommand deviceCommand = new DeviceCommand();
// 配置id值到工具中
deviceCommand.setId(args[0]);
// 配置status值到工具中
deviceCommand.setStatus(args[1]);
// 返回工具
return deviceCommand;
}
}
建设Processor
读完数据后,我们就需要处理惩罚数据了。既然我们前面从文件里读取了待下发的呼吁,那么在这里下发呼吁给设备是最好的机缘。处理惩罚操纵需要实现ItemProcessor<I, O>接口,我们本身实现一个HelloItemProcessor.java即可,代码如下:
public class HelloItemProcessor implements ItemProcessor<DeviceCommand, DeviceCommand> {
@Override
public DeviceCommand process(DeviceCommand deviceCommand) throws Exception {
// 模仿下发呼吁给设备
System.out.println("send command to device, id=" + deviceCommand.getId());
// 更新呼吁状态
deviceCommand.setStatus("SENT");
// 返回呼吁工具
return deviceCommand;
}
}
建设Writer