Elastic+Spring-batch+Mybatis整合实现

本文介绍了如何将Elastic、Spring-Batch和Mybatis整合以实现企业级批处理需求,特别是在第三方支付系统的清分结算场景。文中详细讲解了项目结构、Elastic-Lite-Job的使用、Spring-Batch作业开发以及Elastic如何调度Spring-Batch作业。通过Elastic的分片作业,将数据库中的行业信息按ID奇偶性分别导出到两个文件中。同时,文章提供了Elastic作业监听处理和异常处理的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

因为有企业级批处理需求,具体到应用场景就是在三方支付系统中,日切后要进行清分结算的跑批处理。所以使用到成熟的spring batch,依托其强大且灵活的批量处理功能,再加上elastic任务调度整合来实现清分结算业务流程。本文章就是分别说明了elastic和spring-batch + mybatis的常规使用和两者的整合,仅供大家参考。。

项目整体结构

就先把elastic和spring-batch+mybatis整合的项目工程结构列出来,该工程实现包括:
- Elastic多种作业类型的开发和使用
- 通过Elastic调度spring-batch作业,将数据库中存储行业信息记录按照id的奇偶分别查询出来,写入两个不同的文件中。(也就是通过elastic的分片作业开发实现)
- Elastic-console管理控制台的界面手动触发操作

image

Elastic-Lite-Job

Elastic是一个分布式任务调度框架,可以利用zookeeper作为调度中心,通过管理控制台对任务进行手动关闭、触发、重启,并支持并行调度和任务分片,对spring支持也友好。具体参考官方文档
- 整体架构图(图片来源官网)
image

- 配置依赖
不多说,直接参考官网依赖maven进行配置:

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <latest.release.version>2.1.5</latest.release.version>
    </properties>

        <!-- 添加elastic-job -->
        <dependency>
            <groupId>com.dangdang</groupId>
            <artifactId>elastic-job-lite-core</artifactId>
            <version>${latest.release.version}</version>
        </dependency>
        <dependency>
            <groupId>com.dangdang</groupId>
            <artifactId>elastic-job-lite-spring</artifactId>
            <version>${latest.release.version}</version>
        </dependency>
        <!-- end -->

在pom.xml配置即可。

  • 作业开发

配置了elastic的两种作业类型:简单作业流式处理作业
SimpleJob对应的实现类:

@Component
public class SimpleJobA implements SimpleJob{
   
   

    @Override
    public void execute(ShardingContext context) {
        System.out.println(String.format("------SimpleJobA: Thread ID: %s, 任务总片数: %s, 当前分片项: %s", Thread.currentThread().getId(),context.getShardingTotalCount(),context.getShardingItem()));
    }

}

数据流作业实现类:DataFlowJobEven和DataFlowJobOdd分别查询数据库行业表Industry的id奇偶记录并输出:

@Component
public class DataFlowJobEven implements DataflowJob<Industry>{
   
   

    @Autowired
    private IndustryService industryService;

    @Resource
    private IndustryDAO industry;

    @Override
    public List<Industry> fetchData(ShardingContext context) {
        System.out.println(String.format("------DataFlowJobEven: Thread ID: %s, 任务总片数: %s, 当前分片项: %s", Thread.currentThread().getId(),context.getShardingTotalCount(),context.getShardingItem()));
        List<Industry> retList = industry.queryListEven();
        return retList;
    }

    @Override
    public void processData(ShardingContext context, List<Industry> list) {
        System.out.println("Even count: " + list.size());
        for(Industry in : list) {
            System.out.println(in.getId() + "--" +in.getName() +"--" + in.getEnname());
        }

    }

}


@Component
public class DataFlowJobOdd implements DataflowJob<Industry>{
   
   

    @Resource
    private IndustryService industryService;

    @Resource
    private IndustryDAO industry;

    @Override
    public List<Industry> fetchData(ShardingContext context) {
        System.out.println(String.format("------DataFlowJobOdd: Thread ID: %s, 任务总片数: %s, 当前分片项: %s", Thread.currentThread().getId(),context.getShardingTotalCount(),context.getShardingItem()));
        System.out.println(industry);
        List<Industry> retList = industry.queryListOdd();
        return retList;
    }

    @Override
    public void processData(ShardingContext context, List<Industry> list) {
        System.out.println("Odd count: " + list.size());
        for(Industry in : list) {
            System.out.println(in.getId() +" --" + in.getName() +"--" + in.getEnname());
        }

    }

}

其中作业流的会先调用fetchData方法查询满足条件的数据,再传入processData方法中进行批量处理。
- 配置作业

关于配置文件中的注册中心zookeeper需要自行安装,单机安装也挺简单的,在此就不在说明。
文件名:elastic-job.xml。配置可以参考:elastic-job配置手册

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:job="http://www.dangdang.com/schema/ddframe/job"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.dangdang.com/schema/ddframe/reg
                        http://www.dangdang.com/schema/ddframe/reg/reg.xsd
                        http://www.dangdang.com/schema/ddframe/job
                        http://www.dangdang.com/schema/ddframe/job/job.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd                         
                        ">
    <!-- 这里配置的zookeeper与elastic console有关 -->                   
    <reg:zookeeper server-lists="192.168.7.21:3181" id="goPayCenter"
        namespace="payment-ls" base-sleep-time-milliseconds="1000"
        
<think>我们面临的任务是将多个指定路径下的JAR包安装到本地Maven仓库中。每个JAR包都需要通过Maven的`install:install-file`命令来安装,并且需要提供GroupId、ArtifactId和Version(GAV坐标)。由于用户没有提供这些坐标,我们需要根据JAR文件名推断,或者用户需要自行提供。但根据常见Maven项目的命名规则,我们可以尝试从文件名中提取。 然而,由于这些JAR包可能来自不同的项目,命名规则可能不一致,所以最可靠的方法是用户自己提供每个JAR包的GAV坐标。如果用户无法提供,我们可以尝试按照以下规则从文件名中解析: 格式通常为:`artifactId-version.jar` 或者 `artifactId-version-classifier.jar`,但有时版本号可能包含多个部分(如3.2.0)和多个连字符,这可能导致解析困难。 考虑到这一点,我们建议用户提供每个JAR包的GAV坐标。如果用户坚持从文件名解析,我们可以尝试以下方法(但可能有误): 1. 去掉文件扩展名(.jar) 2. 将文件名按连字符拆分,最后一个部分如果是数字和点(表示版本号)或者有多个部分,那么从后往前取,直到遇到非版本号的部分(这很困难,因为版本号格式多样) 3. 另一种常见做法:版本号通常以数字开头,所以我们可以从后往前找第一个以数字开头的部分作为版本号,前面的部分作为artifactId。 但这种方法并不总是可靠。因此,在下面的解决方案中,我们将假设用户能够提供每个JAR包的GAV坐标。如果用户不能提供,我们将尝试从文件名中解析,并给出警告。 根据用户提供的JAR包文件名,我们尝试解析如下: 1. `knife4j-aggregation-spring-boot-starter-2.0.8.jar`: - 我们期望的格式是:artifactId = `knife4j-aggregation-spring-boot-starter`, version = `2.0.8` - 但注意,这个jar的groupId通常为`com.github.xiaoymin`(根据之前的引用[1])[^1] 2. `dynamic-datasource-spring-boot-starter-3.2.0.jar`: - artifactId: `dynamic-datasource-spring-boot-starter` - version: `3.2.0` 3. `spring-boot-admin-starter-client-2.2.0.jar`: - artifactId: `spring-boot-admin-starter-client` - version: `2.2.0` 4. `spring-boot-admin-starter-server-2.2.0.jar`: - artifactId: `spring-boot-admin-starter-server` - version: `2.2.0` 5. `elasticjob-lite-spring-boot-starter-3.0.1.jar`: - artifactId: `elasticjob-lite-spring-boot-starter` - version: `3.0.1` 对于groupId,不同的jar包可能不同。用户需要知道这些jar包的groupId,否则安装后在其他项目中引用时会出错。如果用户不知道,我们可以暂时用一个通用的groupId(如`com.example`)代替,但这不是推荐做法。 因此,我们建议用户查找这些jar包的groupId。如果无法找到,可以考虑以下方案: - 对于`knife4j`,根据引用[1]可知其groupId为`com.github.xiaoymin`[^1]。 - 对于`spring-boot-admin`,通常groupId为`de.codecentric`。 - 对于`dynamic-datasource`,可能是`com.baomidou`(这是常见的,例如dynamic-datasource-spring-boot-starter是mybatis-plus的扩展)。 - 对于`elasticjob`,可能是`org.apache.shardingsphere.elasticjob`。 如果用户不确定,建议先尝试查找,否则后续使用可能会有问题。 下面,我们将为每个JAR包生成安装命令。命令格式如下: ```bash mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=jar -Dmaven.repo.local=D:\maven\MavenRepository ``` 注意:`-Dmaven.repo.local`参数用于指定本地仓库的位置,这样就不会安装到默认的本地仓库(通常是用户目录下的.m2/repository),而是安装到用户指定的`D:\maven\MavenRepository`。 但是,请注意:`install:install-file`插件默认不会将文件安装到指定的本地仓库目录(除非通过`-Dmaven.repo.local`指定),但这里我们通过该参数指定了本地仓库的位置,因此安装时会直接安装到该目录。 然而,需要提醒的是,`-Dmaven.repo.local`是Maven全局设置,它会影响整个命令执行期间Maven的本地仓库位置。因此,每个命令都会将jar包安装到`D:\maven\MavenRepository`。 下面我们根据假设的groupId(如果用户没有提供,则使用我们推断的)来生成命令。用户需要根据实际情况修改groupId。 我们假设: 1. knife4j-aggregation-spring-boot-starter-2.0.8.jar -> groupId: `com.github.xiaoymin` 2. dynamic-datasource-spring-boot-starter-3.2.0.jar -> groupId: `com.baomidou` (常见,但不确定,用户需要确认) 3. spring-boot-admin-starter-client-2.2.0.jar -> groupId: `de.codecentric` 4. spring-boot-admin-starter-server-2.2.0.jar -> groupId: `de.codecentric` 5. elasticjob-lite-spring-boot-starter-3.0.1.jar -> groupId: `org.apache.shardingsphere` (注意:ElasticJob现在是ShardingSphere的子项目) 如果用户有准确的groupId,请替换。 生成命令如下(在Windows的cmd或PowerShell中执行): ```bash # knife4j mvn install:install-file -Dfile=C:\Users\pc\Downloads\knife4j-aggregation-spring-boot-starter-2.0.8.jar -DgroupId=com.github.xiaoymin -DartifactId=knife4j-aggregation-spring-boot-starter -Dversion=2.0.8 -Dpackaging=jar -Dmaven.repo.local=D:\maven\MavenRepository # dynamic-datasource mvn install:install-file -Dfile=C:\Users\pc\Downloads\dynamic-datasource-spring-boot-starter-3.2.0.jar -DgroupId=com.baomidou -DartifactId=dynamic-datasource-spring-boot-starter -Dversion=3.2.0 -Dpackaging=jar -Dmaven.repo.local=D:\maven\MavenRepository # spring-boot-admin client mvn install:install-file -Dfile=C:\Users\pc\Downloads\spring-boot-admin-starter-client-2.2.0.jar -DgroupId=de.codecentric -DartifactId=spring-boot-admin-starter-client -Dversion=2.2.0 -Dpackaging=jar -Dmaven.repo.local=D:\maven\MavenRepository # spring-boot-admin server mvn install:install-file -Dfile=C:\Users\pc\Downloads\spring-boot-admin-starter-server-2.2.0.jar -DgroupId=de.codecentric -DartifactId=spring-boot-admin-starter-server -Dversion=2.2.0 -Dpackaging=jar -Dmaven.repo.local=D:\maven\MavenRepository # elasticjob mvn install:install-file -Dfile=C:\Users\pc\Downloads\elasticjob-lite-spring-boot-starter-3.0.1.jar -DgroupId=org.apache.shardingsphere.elasticjob -DartifactId=elasticjob-lite-spring-boot-starter -Dversion=3.0.1 -Dpackaging=jar -Dmaven.repo.local=D:\maven\MavenRepository ``` 注意:以上命令中的groupId是假设的,如果用户有准确的groupId,请务必替换。如果用户不确定,建议先查找官方文档或Maven中央仓库(https://search.maven.org/)来确认。 另外,这些命令需要Maven已经安装并配置好环境变量(即命令行中可以直接运行`mvn`命令)。 执行每个命令后,Maven会将指定的JAR包安装到本地仓库的相应位置(在`D:\maven\MavenRepository`下按groupId/artifactId/version的目录结构存放)。 如果用户不想一个一个执行,可以写一个批处理文件(.bat)或shell脚本,将上述命令保存为一个文件(如`install_jars.bat`),然后运行该批处理文件。 重要提示:在运行这些命令之前,请确保关闭所有可能占用这些JAR文件的程序(如IDE),以免出现文件锁导致无法读取。 如果用户在执行过程中遇到问题(如权限不足),请尝试以管理员身份运行命令行。 最后,安装完成后,用户可以在项目中通过提供的GAV坐标引用这些依赖。 ### 相关问题 1. 如何在Maven项目中引用本地仓库中的自定义JAR包? 2. 如何确认一个JAR包的GroupId、ArtifactId和Version? 3. Maven安装依赖时出现权限错误如何解决? 4. 如何批量安装多个JAR包到Maven本地仓库? 5. 如何修改Maven的默认本地仓库路径?</think>### 如何将多个 JAR 包安装到本地 Maven 仓库 您需要将指定目录下的多个 JAR 包安装到本地 Maven 仓库(`D:\maven\MavenRepository`)。以下是详细步骤和命令: #### 步骤 1:准备安装命令模板 使用 Maven 的 `install:install-file` 命令安装单个 JAR 包的基本格式: ```bash mvn install:install-file \ -Dfile=<JAR文件路径> \ -DgroupId=<组ID> \ -DartifactId=<构件ID> \ -Dversion=<版本号> \ -Dpackaging=jar \ -DlocalRepositoryPath=D:\maven\MavenRepository ``` #### 步骤 2:为每个 JAR 包生成安装命令 根据文件名推断 GAV 坐标(GroupId, ArtifactId, Version),实际使用时请根据项目要求调整: 1. **knife4j-aggregation-spring-boot-starter-2.0.8.jar** ```bash mvn install:install-file \ -Dfile=C:\Users\pc\Downloads\knife4j-aggregation-spring-boot-starter-2.0.8.jar \ -DgroupId=com.github.xiaoymin \ -DartifactId=knife4j-aggregation-spring-boot-starter \ -Dversion=2.0.8 \ -Dpackaging=jar \ -DlocalRepositoryPath=D:\maven\MavenRepository ``` 2. **dynamic-datasource-spring-boot-starter-3.2.0.jar** ```bash mvn install:install-file \ -Dfile=C:\Users\pc\Downloads\dynamic-datasource-spring-boot-starter-3.2.0.jar \ -DgroupId=com.baomidou \ -DartifactId=dynamic-datasource-spring-boot-starter \ -Dversion=3.2.0 \ -Dpackaging=jar \ -DlocalRepositoryPath=D:\maven\MavenRepository ``` 3. **spring-boot-admin-starter-client-2.2.0.jar** ```bash mvn install:install-file \ -Dfile=C:\Users\pc\Downloads\spring-boot-admin-starter-client-2.2.0.jar \ -DgroupId=de.codecentric \ -DartifactId=spring-boot-admin-starter-client \ -Dversion=2.2.0 \ -Dpackaging=jar \ -DlocalRepositoryPath=D:\maven\MavenRepository ``` 4. **spring-boot-admin-starter-server-2.2.0.jar** ```bash mvn install:install-file \ -Dfile=C:\Users\pc\Downloads\spring-boot-admin-starter-server-2.2.0.jar \ -DgroupId=de.codecentric \ -DartifactId=spring-boot-admin-starter-server \ -Dversion=2.2.0 \ -Dpackaging=jar \ -DlocalRepositoryPath=D:\maven\MavenRepository ``` 5. **elasticjob-lite-spring-boot-starter-3.0.1.jar** ```bash mvn install:install-file \ -Dfile=C:\Users\pc\Downloads\elasticjob-lite-spring-boot-starter-3.0.1.jar \ -DgroupId=org.apache.shardingsphere.elasticjob \ -DartifactId=elasticjob-lite-spring-boot-starter \ -Dversion=3.0.1 \ -Dpackaging=jar \ -DlocalRepositoryPath=D:\maven\MavenRepository ``` #### 步骤 3:执行安装命令 1. 打开命令提示符(CMD)或 PowerShell 2. 逐条执行上述命令(每次执行一个) 3. 等待出现 `BUILD SUCCESS` 提示表示安装完成 #### 验证安装结果 检查仓库目录结构: ``` D:\maven\MavenRepository ├── com │ └── github │ └── xiaoymin │ └── knife4j-aggregation-spring-boot-starter │ └── 2.0.8 │ └── knife4j-aggregation-spring-boot-starter-2.0.8.jar ├── com │ └── baomidou │ └── dynamic-datasource-spring-boot-starter │ └── 3.2.0 │ └── dynamic-datasource-spring-boot-starter-3.2.0.jar └── de └── codecentric ├── spring-boot-admin-starter-client │ └── 2.2.0 │ └── spring-boot-admin-starter-client-2.2.0.jar └── spring-boot-admin-starter-server └── 2.2.0 └── spring-boot-admin-starter-server-2.2.0.jar ``` #### 注意事项 1. **GAV 坐标说明**: - `GroupId`:项目组织标识(如 `com.github.xiaoymin`) - `ArtifactId`:项目唯一标识(如 `knife4j-aggregation-spring-boot-starter`) - `Version`:版本号(如 `2.0.8`) 2. **权限问题**: - 确保对 `D:\maven\MavenRepository` 有写权限 - 建议以管理员身份运行命令提示符 3. **批量处理**: 可将所有命令保存为 `.bat` 文件批量执行: ```batch @echo off REM 保存为 install_jars.bat mvn install:install-file -Dfile=C:\Users\pc\Downloads\knife4j-aggregation-spring-boot-starter-2.0.8.jar ... mvn install:install-file -Dfile=C:\Users\pc\Downloads\dynamic-datasource-spring-boot-starter-3.2.0.jar ... ...其他命令... ``` ### 相关问题 1. 如何在 Maven 项目中引用本地仓库中的自定义 JAR 包? 2. 如果 JAR 包缺少 POM 文件,安装时会出现什么问题? 3. 如何将 Spring Boot Starter 组件集成到微服务项目中(参考 Knife4j 配置)[^2]? 4. Maven 本地仓库和中央仓库的依赖解析优先级是什么? 5. 如何解决 Knife4j 在生产环境的安全配置问题[^4]?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值