Spring Batch 批处理-作业参数设置与获取

news2024/12/24 2:54:16

引言

书接上篇Spring Batch批处理-作业Job简介,上篇带小伙伴们了解色作业Job对象,那这篇就看一下作业参数是啥一回事,同时要怎么设置参数并获取参数的。

JobParameters

前面提到,作业的启动条件是作业名称 + 识别参数,Spring Batch使用JobParameters类来封装了所有传给作业参数。

看下JobParameters 源码

public class JobParameters implements Serializable {

	private final Map<String,JobParameter> parameters;

	public JobParameters() {
		this.parameters = new LinkedHashMap<>();
	}

	public JobParameters(Map<String,JobParameter> parameters) {
		this.parameters = new LinkedHashMap<>(parameters);
	}
    .....
}

 从上面代码/截图来看,JobParameters 类底层维护了Map<String,JobParameter>,是一个Map集合的封装器,提供了不同类型的get操作。

作业参数设置

回顾Spring Batch 入门案例,我们通过debug可以看到,job作业最终是执行靠的JobLauncher(job启动器)接口的实现类:SimpleJobLauncher run方法启动。

JobLauncher启动器接口run方法约定:

public interface JobLauncher {
	public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException,
			JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException;

}

在JobLauncher 启动器执行run方法时,直接传入即可。

jobLauncher.run(job, params);

目前我们使用SpringBoot 方式启动Spring Batch那该怎么传值呢?

1>定义ParamJob类,准备好要执行的job

package com.langfeiyes.batch._02_params;

import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;


@SpringBootApplication
@EnableBatchProcessing
public class ParamJob {
    //job构造器工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    //step构造器工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Tasklet tasklet(){
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("param SpringBatch....");
                return RepeatStatus.FINISHED;
            }
        };
    }
    @Bean
    public Step  step1(){
        return  stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }
    @Bean
    public Job job(){
        return jobBuilderFactory.get("param-job")
                .start(step1())
                .build();
    }
    public static void main(String[] args) {
        SpringApplication.run(HelloJob.class, args);
    }
}

2>使用idea的命令传值的方式设置job作业参数

注意:如果不行这么麻烦,其实也可以,先空参数执行一次,然后指定参数后再执行。

点击绿色按钮,启动SpringBoot程序,作业运行之后,会在batch_job_execution_params 增加一条记录,用于区分唯一的Job Instance实例

 注意:如果不改动JobParameters 参数内容,再执行一次批处理,会直接报错。

 

原因:Spring Batch 相同Job名与相同标识参数只能成功执行一次。

作业参数获取

 当将作业参数传入到作业流程,该如何获取呢?

Spring Batch 提供了2种方案:

方案1:使用ChunkContext类  

修改ParamConfig 配置类中tasklet写法

@Bean
public Tasklet tasklet(){
    return new Tasklet() {
        @Override
        public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
            Map<String, Object> parameters = chunkContext.getStepContext().getJobParameters();
            System.out.println("params---name:" + parameters.get("name"));
            return RepeatStatus.FINISHED;
        }
    };
}

注意:job名:param-job job参数:name=dafei 已经执行了,再执行会报错

所以要么改名字,要么改参数,这里选择改job名字(拷贝一份job实例方法,然后注释掉,修改Job名称)

//    @Bean
//    public Job job(){
//        return jobBuilderFactory.get("param-job")
//                .start(step1())
//                .build();
//    }

    @Bean
    public Job job(){
        return jobBuilderFactory.get("param-chunk-job")
                .start(step1())
                .build();
    }

方案2:使用@Value 延时获取

@StepScope
@Bean
public Tasklet tasklet(@Value("#{jobParameters['name']}")String name){
    return new Tasklet() {
        @Override
        public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
            System.out.println("params---name:" + name);
            return RepeatStatus.FINISHED;
        }
    };
}

@Bean
public Step  step1(){
    return  stepBuilderFactory.get("step1")
        .tasklet(tasklet(null))
        .build();
}

step1调用tasklet实例方法时不需要传任何参数,Spring Boot 在加载Tasklet Bean实例时会自动注入。

//    @Bean
//    public Job job(){
//        return jobBuilderFactory.get("param-chunk-job")
//                .start(step1())
//                .build();
//    }

@Bean
public Job job(){
    return jobBuilderFactory.get("param-value-job")
        .start(step1())
        .build();
}

这里要注意,必须贴上@StepScope ,表示在启动项目的时候,不加载该Step步骤bean,等step1()被调用时才加载,这就是所谓延时获取。

到这,参数设置与获取就ok啦,下一篇,来看下作业参数校验怎么玩~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQ消息中间件

MQ消息中间件1、应用场景1、流量削峰2、应用解耦3、异步处理2、MQ分类1、ActiveMQ2、kafka3、RocketMQ4、RabbitMQ3、RabbitMQ详解3.1、核心概念3.2 RabbitMQ基本知识点3.3消息发布确认3.4 交换机1、应用场景 1、流量削峰 将访问的大流量通过消息队列做缓冲&#xff0c;我们可…

二叉树-二叉树的基础遍历(3)

二叉树的遍历的三种方式 1.前序遍历&#xff1b; 先访问根结点&#xff0c;然后再访问左子树&#xff0c;最后访问右子树 2.中序遍历&#xff1b; 先访问左子树&#xff0c;中间访问根节点&#xff0c;最后访问右子树 3.后序遍历&#xff1b; 先访问左子树&#xff0c;再访问右…

PicoRV32 笔记 05

接口信号 PicoRV32 提供一个本地存储器接口&#xff0c;Native Memory Interface。 本地存储器接口采用 valid-ready握手信号。这种机制在axi总线中使用相同&#xff0c;能够实现流控&#xff0c; 和axi总线不同点&#xff0c;PicoRV32本地接口使用一组valid-ready信号&…

什么是SWDM4和100G QSFP28 SWDM4光模块?

随着OM5多模光纤(MMF)的推广和40G或100G数据中心传输网络的大规模部署&#xff0c;SWDM技术逐渐进入人们的视野并开始得到应用。那么&#xff0c;什么是SWDM4呢&#xff1f;什么是100G SWDM4光模块&#xff1f;它们的优势是什么&#xff1f;跟着易天光通信ETU-LINK看下面的文字…

十、原型、原型链、闭包和立即执行函数、插件开发初始

十、原型、原型链、闭包和立即执行函数、插件开发初始 原型 什么是原型&#xff08;prototype&#xff09;&#xff1f; 无论何时&#xff0c;只要创建一个函数&#xff0c;就会按照特定的规则为这个函数创建一个prototype属性&#xff0c;指向原型对象。 function Car(){}…

Vue入门与指令

Vue入门 1.1、MVVM编程思想 MVVM&#xff1a;页面输入改变数据&#xff0c;数据改变影响页面数据展示与渲染。 M&#xff08;model&#xff09;&#xff1a;普通的javascript数据对象。 V&#xff08;view&#xff09;&#xff1a;前端展示页面。 VM&#xff08;ViewModel&…

Jmeter初了解-接口并发测试

Jmeter初了解-接口并发测试 介绍 我们在开发的时候&#xff0c;经常会需要进行接口压力测试&#xff0c;确定接口运行的稳定情况 这里我们就使用java开发的测试工具Jmeter来进行测试。 Jmeter 官网地址 Apache JMeter™应用程序是开源软件&#xff0c;是一个 100% 纯 Jav…

Pytorch安装详细过程及遇到的问题解决

一、Aanconda的安装 可以参考笔者的这篇博客&#xff1a;Anaconda安装详细教程 二、准备工作 1、查看本机的python的版本(本机python解释器版本为3.8.5) 2、单击启动Anaconda Prompt创建新虚拟环境 3、在Anaconda Prompt依次执行以下命令&#xff0c;创建名字为pytorch的虚拟…

nn.Embedding使用

nn.Embedding是一种词嵌入的方式&#xff0c;跟one-hot相似但又不同&#xff0c;会生成低维稠密向量&#xff0c;但是初始是随机化的&#xff0c;需要根据模型训练时进行调节&#xff0c;若使用预训练词向量模型会比较好。 1. one-hot one-hot是给定每个单词一个索引&#xf…

概论_第4章__方差D(X)的定义和性质

一 定义 通常以此公式来计算&#xff1a; 就是说&#xff1a; 方差 X的平方再求期望 —— X的期望的平方 即 括号里面的平方的期望减去期望的平方&#xff0c; 怎样求期望点击&#xff1a;概论_第4章__期望的定义和性质 注意&#xff1a; 方差不可能为负数。 2. …

如何快速拥有自己的虚拟形象?

元宇宙&#xff08;Metaverse&#xff09;&#xff0c;是人类运用数字技术构建的&#xff0c;由现实世界映射或超越现实世界&#xff0c;可与现实世界交互的虚拟世界&#xff0c;具备新型社会体系的数字生活空间。 可见元宇宙第一步是创建专属虚拟形象&#xff0c;但创建3D虚拟…

Android入门第45天-手工发送一个BroadCast

简介 上一篇我们讲了简单的动态BroadCast&#xff0c;今天我们通过手工来发送一条BroadCast进一步来了解BroadCast。 在上一篇里我们使用BroadCast监听网络状态&#xff0c;今天我们要完成的是自己发一条自自己的消息来触发BroadCast Receiver。 设计 为了让Receiver收听到…

蓝牙耳机无延迟哪款好?适合打游戏的无线蓝牙耳机

手机可以说是人手必备&#xff0c;随声得还有蓝牙耳机&#xff0c;随着3.5耳机孔得消失&#xff0c;蓝牙耳机可以说是现在得主流&#xff0c;无论哪个年龄段都可以佩戴蓝牙耳机&#xff0c;日常听歌、追剧&#xff0c;和朋友玩游戏佩戴蓝牙耳机&#xff0c;已经成为一种生活方式…

mybatis06:MyBatis的多表操作

目录 1.一对一关系 2.一对多查询 3.多对多查询 4例题演示 ​5.知识小结 1.一对一关系 2.一对多查询 3.多对多查询 4例题演示 前置准备 对应的依赖 <dependencies><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId&…

外汇交易:流行图表指标盘点

您所学到的关于交易的一切都像一种工具&#xff0c;已被添加到外汇交易者的工具箱中。当您在正确的时间使用正确的工具时&#xff0c;您的图表指标工具将为您提供更好的机会做出正确的交易决策。 布林带 布林带用来衡量市场的波动性。它们的作用类似于迷你支撑位和阻力位。 布…

MES系统为何与工厂数字化转型联系紧密

随着数字化技术的发展&#xff0c;MES系统的定义也是在不断的变化。但是&#xff0c;计划调度、质量管理、生产执行以及数据采集&#xff0c;一直都是MES的核心功能。 工厂数字化改造&#xff0c;对于制造业来说并不是一场革命。很多工厂在十年前就实现了车间设备的联网&#…

EXCEL基础:数据有效性设置与从身份证号码提取出生日期、性别操作

如下所示&#xff0c;为某公司的人员信息表&#xff0c;以下操作均是基于该表格&#xff0c;声明&#xff1a;该表格来自网络&#xff01; 下面进行【数据有效性】的设置&#xff1a; 先选中区域&#xff0c;弹出【数据有效性】对话框&#xff0c;在【设置】里的【允许】里输入…

win11设置java环境变量

python环境变量比java简单很多&#xff0c;而java比较麻烦&#xff0c;下面这些步骤应该是一步不能少&#xff0c;必须新建两个而且移动到最上面 一、找到设置环境变量 只要是windows系统&#xff0c;他就长这样&#xff0c;需要找到这个页面 很多之前的文章都会说&#xff1…

[附源码]Node.js计算机毕业设计电影院订票系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

六、作用域,作用域链,预编译,闭包基础

六、作用域&#xff0c;作用域链&#xff0c;预编译&#xff0c;闭包基础 使用AO,GO说明作用域和作用域链 AO与函数有关&#xff0c;函数能创造出独立的空间&#xff0c;但是这句话不太对&#xff0c;接下来就是解释&#xff1a; 对象 每个对象都有属性和方法&#xff1a; …