媒介
在大型的企业应用中,或多或少城市存在大量的任务需要处理惩罚,如邮件批量通知所有将要逾期的会员等等。而在批量处理惩罚任务的进程中,又需要留意许多细节,如任务异常、机能瓶颈等等。那么,利用一款优秀的框架总比我们本身反复地造轮子要好得多一些。
我地址的物联网云平台部分就有这么一个需求,需要实现批量下发呼吁给百万设备。为了防备枯燥乏味,下面就让我们先通过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