Spring Batch批处理-作业Job简介

news2024/10/6 8:39:07

引言

书接上篇Spring Batch 批处理入门案例解析,上篇带小伙伴们写了一个Spring Batch 入门案例解析,本篇就开始批处理正文啦,今天先对作业Job做个全面了解。

作业介绍

目前很多项目都流程的概念,比如web应用,集成应用,大数据应用等,它们提供业务逻辑需要按照一定业务流程执行。举个例子:电商项目,一次完整的购物流程包括:浏览商品、加购物车、结算、支付、物流等流程。

Job作业跟这些流程类似,我们将作业定义为唯一的、有序的步骤列表,能够从头到尾独立执行。

  • 唯一

    SpringBatch 中Job作业对象可以使用@Bean方式配置,在整个Spring容器是唯一的,可以重复使用。可以根据不同参数按需多次执行作业。

  • 有序的步骤列表

    一次作业由不同的步骤组成,这些步骤顺序是有意义的,如果不按照顺序执行,会引起逻辑混乱,比如购物流程,先加结算,再支付,最后物流,如果反过来那就乱套了,作业也是这么一回事。

  • 从头到尾

    一次作业步骤固定了,在没有外部交互情况下,会从头到尾执行,前一个步骤做完才会到后一个步骤执行,不允许随意跳转,但是可以按照一定逻辑跳转。

  • 独立

    每一个批处理作业都应该不受外部依赖影响情况下执行。

看回这幅图,批处理作业Job是由一组步骤Step对象组成,每一个作业都有自己名称,可以定义Step执行顺序。

当作业运行时,会创建一个Job Instance(作业实例),Job Instance代表作业的一次逻辑运行,可通过作业名称与作业标识参数进行区分。比如一个每天都要执行一次批处理逻辑。代码设计时,只需要定义好Job的执行步骤即可。每天传入作业识别参数(例如:日期区分)就能启动并执行批处理。一次启动就是一个Job Instance实例。另外,作业在执行时候,也会创建一个Job Excution(作业执行器),负责记录Job执行情况(比如:开始执行时间,结束时间,处理状态等)。

那为啥会出现上面架构设计呢?原因很简单:批处理执行过程中可能出现两种情况:

  • 一种是一次成功

    仅一次就成从头到尾正常执行完毕,在数据库中会记录一条Job Instance 信息, 跟一条 Job Excution 信息

  • 另外一种异常执行

    在执行过程因异常导致作业结束,在数据库中会记录一条Job Instance 信息, 跟一条Job Excution 信息。如果此时使用相同识别参数再次启动作业,那么数据库中不会多一条Job Instance 信息, 但是会多了一条Job Excution 信息,这就意味中任务重复执行了。刚刚说每天批处理任务案例,如果当天执行出异常,那么人工干预修复之后,可以再次执行。

最后来个总结:

Job Instance = Job名称 + 识别参数

Job Instance 一次执行创建一个 Job Excution对象

完整的一次Job Instance 执行可能创建一个Job Excution对象,也可能创建多个Job Excution对象

作业配置

具体配置跟入门案例差不多,看下面例子

package com.langfeiyes.batch._01_hello;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
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.launch.JobLauncher;
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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableBatchProcessing
public class HelloJob {
    //job调度器
    @Autowired
    private JobLauncher jobLauncher;
    //job构造器工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    //step构造器工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    //任务-step执行逻辑由tasklet完成
    @Bean
    public Tasklet tasklet(){
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello SpringBatch....");
                return RepeatStatus.FINISHED;
            }
        };
    }
    //作业步骤-不带读/写/处理
    @Bean
    public Step step1(){
        return stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }
    //定义作业
    @Bean
    public Job job(){
        return jobBuilderFactory.get("hello-job")
                .start(step1())
                .build();
    }
    
    public static void main(String[] args) {
        SpringApplication.run(HelloJob.class, args);
    }

}

在启动类中贴上@EnableBatchProcessing注解,SpringBoot会自动听JobLauncher JobBuilderFactory StepBuilderFactory 对象,分别用于执行Jog,创建Job,创建Step逻辑。有了这些逻辑,Job批处理就剩下组装了。  

这种是springboot配置方式,当然还有xml配置,这里不讲,原因很简单,SpringBoot已经是web项目必备操作了,传统Spring项目已经很少见啦。

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

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

相关文章

Java基础03_数据类型

数据类型 强类型语言 要求变量的使用要严格符合规定,所有的变量必须先定义后使用;安全性高但是速度低; 弱类型语言 例如:‘12’ 3 123 或者 ‘12’ 3 ‘123’ 在强类型语言中是有明显的区别的。而在弱类型语言中是不区分的…

算符优先分析器的构造

一、实验目的 (1)理解自底向上的语法分析的基本思想。 (2)理解算符优先文法的概念。 (4)掌握算符优先分析器的工作原理和工作流程。 (3)掌握算符分析表和优先函数的构造。 二、实验…

函数式接口

Lambda表达式的本质:作为函数式接口的实例 如果一个接口中,只声明一个抽象方法,则此接口就称为函数式接口 FunctionalInnterface public interface MyInterface{void method1(); }要想用Lambda表达式就一定要在函数式接口的条件下使用 相当于…

微信小程序直播状态接口如何获取

现如今,小程序直播非常的红火,越来越多的商家开通了微信小程序直播,但是在直播的过程中,偶尔会出现一些小问题,如禁播,异常状态等等,下面小编就来介绍一下微信小程序直播状态接口如何获取。 一、…

echarts5.4立体柱状图

资源下载&#xff1a;https://www.jsdelivr.com/package/npm/echarts 效果图&#xff1a; 借鉴资源&#xff1a;echarts 如何绘制三维 3D 立体柱状图 - 简书 代码示例&#xff1a; <!DOCTYPE html> <head><meta charset"utf-8"><title>ECh…

基于51单片机的智能小车系统设计

原理图&#xff1a; 程序运行图&#xff1a; 部分程序&#xff1a; /******************************************************************************* * 文件名称&#xff1a;main.c * 说明&#xff1a;本文件为小车控制的主函数 * 功能&…

分布式websocket探索

单体式架构 根据基于golang的gin框架开发的web项目所展开 如果一个Web项目采用单体式架构且配备了websocket通讯的功能&#xff0c;那么在单个实例中是能够正常运行的 在我的项目中&#xff0c;用户可以通过websocket来进行实时通讯和实时消息通知&#xff0c;同时如果在web业务…

AcrelEMS-IDC数据中心综合能效管理系统解决方案-Susie 周

1、概述 安科瑞电气紧跟数据中心发展形式&#xff0c;推出AcrelEMS-IDC数据中心综合能效管理解决方案&#xff0c;包含有电力监控、动环监控、消防监控、能耗统计分析、智能照明控制以及新能源监测几个子系统。集成了变配电监测、电源备自投、电气接点测温、智能照明控制、电能…

yearning搭建及使用

yearning搭建及使用 数据库审计管理&#xff0c;是数据安全规范中不可或缺的一环&#xff0c;通过审计管理我们能够把控、追溯sql执行情况。yearning作为一款开源的数据库审计软件&#xff0c;是我们开发运维工作中经常打交道的一个“伙伴”。 yearning提供的核心功能就是sql…

mysql 自增字段、属性

mysql自增属性 参考文章 https://www.php.cn/mysql-tutorials-489209.html https://blog.csdn.net/qq_41045806/article/details/108310772 在Mysql中&#xff0c;可以为某一属性设置自增属性&#xff0c;可以很好地为我们解决属性值重复的问题。 在mysql中&#xff0c;使用au…

DevExpress Universal全面的软件开发包

DevExpress Universal全面的软件开发包 DevExpress Universal帮助您使用所有DevExpress单平台控件等为Windows、Web、移动和平板电脑构建应用程序。它包括桌面控件(WinForms、WPF、UWP和桌面报告)、Web控件(ASP.NET、ASP.NET MVC和Core、Bootstrap Web Forms、JavaScript-jQuer…

第十章用Python获取sqlite、MySQL、Excel、csv、json中的数据

这里写目录标题项目背景获取sqlite3中的数据sqlite3库获取sqlite数据pandas库获取sqlite数据获取MySQL中的数据pymsql库获取MySQL数据pandas库获取mysql数据获取Excel中的数据xlrd库获取Excel数据pandas库获取Excel数据获取csv中的数据csv库读取csv数据pandas读取csv数据获取js…

Docker02(数据卷)

目录 一、宿主机与容器之间的文件拷贝 二、数据卷 三、数据卷容器 四、Dockerfile Dockerfile简介 自定义centos&#xff0c;具备vim及ifconfig作用 自定义tomcat8 一、宿主机与容器之间的文件拷贝 在生产环境中使用 Docker &#xff0c;往往需要对数据进行持久化&#…

Spring Cloud微服务治理框架深度解析

在学习一个技术之前&#xff0c;首先我们要了解它是做什么的&#xff0c;我们为什么要用它。不然看再多资料都理解不了&#xff0c;因此我们先来讲解下Spring Cloud Spring Cloud是一套微服务治理框架&#xff0c;几乎考虑到了微服务治理的方方面面。那么接下来具体说下 Spring…

WebRTC客户端主要流程分析

1.通信过程 因为WebRTC规范里没有包含信令协议&#xff0c;所以像OWT、mediasoup等支持WebRTC的开源项目&#xff0c;其通信两端建立连接的过程中的信令逻辑各不相同。但是&#xff0c;总体上来说&#xff0c;其通信过程必然会包括以下过程。 发起端创建本地的PeerConnection&…

基于微信小程序的校友录系统-计算机毕业设计

项目介绍 本系统采用微信开发者开发、结合后台java语言以及Mysql数据库等技术。系统主要分为管理员和用户、校友三部分&#xff0c;管理员服务端&#xff1a;首页、个人中心、用户管理、校友管理、校友风采管理、校友视频管理、视频分类管理、班级信息管理、留言板管理、论坛交…

虹科方案|适用于VMware vSphere®环境的Mac Pro®和微型服务器存储连接

一、前言 Thunderbolt支持ATTO的VMWare ESXi和ThunderLink产品线&#xff0c;使我们能够创建基于Mac的vSphere设置&#xff0c;从而能够为我们的macOS服务器提供虚拟化服务。将虚拟硬件、快照和Veeam备份与macOS服务器的简单性相结合&#xff0c;将改变SMB市场的游戏规则。 二…

3y开发都不的不写单元测试,然后被被批了

他是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手 最近在看单元测试的东西&#xff0c;想跟大家聊聊我的感受。单元测试这块说实在的&#xff0c;我并不太熟悉&#xff0c;我几乎不写单元测试&#x…

基于Sovit3D可视化开发的智慧港口数字孪生系统

港口作为经济的晴雨表&#xff0c;是现代经济的血液&#xff0c;是促进贸易和地区发展的重要基础设施。全球贸易中约90%的贸易由海运业承载&#xff0c;港口是其中重要一环。 建设背景 作为“21世纪海上丝绸之路”的重要节点&#xff0c;港口在“一带一路”建设中有着举足轻重…

nginx下载与安装

文章目录一.下载二.安装1.将压缩包上传到我们的服务器 /opt 目录下2.安装编译文件需要的c3.解压压缩包&#xff08;首先需要进入 /opt 目录下 即压缩包文件所在目录&#xff09;4.将解压后的文件夹剪切到指定目录 nginx ,这里我们放在了 /usr/local 目录下5.进入nginx文件目录6…