欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

所以框架使用了JobEx 图纸加密 ecution来表示每次执行的任务

点击: 次  来源:宝鼎软件 时间:2017-08-10

原文出处: 吴兆锋

媒介

在大型的企业应用中,或多或少城市存在大量的任务需要处理惩罚,如邮件批量通知所有将要逾期的会员等等。而在批量处理惩罚任务的进程中,又需要留意许多细节,如任务异常、机能瓶颈等等。那么,利用一款优秀的框架总比我们本身反复地造轮子要好得多一些。

我地址的物联网云平台部分就有这么一个需求,需要实现批量下发呼吁给百万设备。为了防备枯燥乏味,下面就让我们先通过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