# RocketMQ 实战:模拟电商网站场景综合案例(六)

RocketMQ 实战:模拟电商网站场景综合案例(六)

一、RocketMQ 实战 :项目公共类介绍

1、ID 生成器 :IDWorker:Twitter 雪花算法。

在 shop-common 工程模块中,IDWorker.java 是 ID 生成器公共类,运用 Twitter 雪花算法,自动生成项目 ID,而不会存在重复现象。


package com.itheima.utils;public class IDWorker {/*** 起始的时间戳*/private final static long START_STMP = 1480166465631L;/*** 每一部分占用的位数*/private final static long SEQUENCE_BIT = 12; //序列号占用的位数private final static long MACHINE_BIT = 5;   //机器标识占用的位数private final static long DATACENTER_BIT = 5;//数据中心占用的位数/*** 每一部分的最大值*/private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);/*** 每一部分向左的位移*/private final static long MACHINE_LEFT = SEQUENCE_BIT;private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;private long datacenterId;  //数据中心private long machineId;     //机器标识private long sequence = 0L; //序列号private long lastStmp = -1L;//上一次时间戳public IDWorker(long datacenterId, long machineId) {if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");}if (machineId > MAX_MACHINE_NUM || machineId < 0) {throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");}this.datacenterId = datacenterId;this.machineId = machineId;}/*** 产生下一个ID** @return*/public synchronized long nextId() {long currStmp = getNewstmp();if (currStmp < lastStmp) {throw new RuntimeException("Clock moved backwards.  Refusing to generate id");}if (currStmp == lastStmp) {//相同毫秒内,序列号自增sequence = (sequence + 1) & MAX_SEQUENCE;//同一毫秒的序列数已经达到最大if (sequence == 0L) {currStmp = getNextMill();}} else {//不同毫秒内,序列号置为0sequence = 0L;}lastStmp = currStmp;return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分| datacenterId << DATACENTER_LEFT       //数据中心部分| machineId << MACHINE_LEFT             //机器标识部分| sequence;                             //序列号部分}private long getNextMill() {long mill = getNewstmp();while (mill <= lastStmp) {mill = getNewstmp();}return mill;}private long getNewstmp() {return System.currentTimeMillis();}public static void main(String[] args) {IDWorker idWorker = new IDWorker(2, 3);for (int i = 0; i < 10; i++) {System.out.println(idWorker.nextId());}}}

在这里插入图片描述

2、异常处理类:

在 shop-common 工程模块中,
CustomerException.java :自定义异常公共类,CastException.java :异常抛出公共类。

package com.itheima.exception;import com.itheima.constant.ShopCode;
import lombok.extern.slf4j.Slf4j;/*** 异常抛出类*/
@Slf4j
public class CastException {public static void cast(ShopCode shopCode) {log.error(shopCode.toString());throw new CustomerException(shopCode);}
}

package com.itheima.exception;import com.itheima.constant.ShopCode;/*** 自定义异常*/
public class CustomerException extends RuntimeException{private ShopCode shopCode;public CustomerException(ShopCode shopCode) {this.shopCode = shopCode;}
}

3、常量类 : ShopCode:系统状态类

在 shop-common 工程模块中,ShopCode.java :是系统状态公共类。


package com.itheima.constant;/*** @author Think*/public enum ShopCode {//正确SHOP_SUCCESS(true, 1, "正确"),//错误SHOP_FAIL(false, 0, "错误"),//付款SHOP_USER_MONEY_PAID(true, 1, "付款"),//退款SHOP_USER_MONEY_REFUND(true, 2, "退款"),//订单未确认SHOP_ORDER_NO_CONFIRM(false, 0, "订单未确认"),//订单已确认SHOP_ORDER_CONFIRM(true, 1, "订单已经确认"),//订单已取消SHOP_ORDER_CANCEL(false, 2, "订单已取消"),//订单已取消SHOP_ORDER_INVALID(false, 3, "订单无效"),//订单已取消SHOP_ORDER_RETURNED(false, 4, "订单已退货"),//订单已付款SHOP_ORDER_PAY_STATUS_NO_PAY(true,0,"订单未付款"),//订单已付款SHOP_ORDER_PAY_STATUS_PAYING(true,1,"订单正在付款"),//订单已付款SHOP_ORDER_PAY_STATUS_IS_PAY(true,2,"订单已付款"),//消息正在处理SHOP_MQ_MESSAGE_STATUS_PROCESSING(true, 0, "消息正在处理"),//消息处理成功SHOP_MQ_MESSAGE_STATUS_SUCCESS(true, 1, "消息处理成功"),//消息处理失败SHOP_MQ_MESSAGE_STATUS_FAIL(false, 2, "消息处理失败"),//请求参数有误SHOP_REQUEST_PARAMETER_VALID(false, -1, "请求参数有误"),//优惠券已经使用SHOP_COUPON_ISUSED(true, 1, "优惠券已经使用"),//优惠券未使用SHOP_COUPON_UNUSED(false, 0, "优惠券未使用"),//快递运费不正确SHOP_ORDER_STATUS_UPDATE_FAIL(false, 10001, "订单状态修改失败"),//快递运费不正确SHOP_ORDER_SHIPPINGFEE_INVALID(false, 10002, "订单运费不正确"),//订单总价格不合法SHOP_ORDERAMOUNT_INVALID(false, 10003, "订单总价格不正确"),//订单保存失败SHOP_ORDER_SAVE_ERROR(false, 10004, "订单保存失败"),//订单确认失败SHOP_ORDER_CONFIRM_FAIL(false, 10005, "订单确认失败"),//商品不存在SHOP_GOODS_NO_EXIST(false, 20001, "商品不存在"),//订单价格非法SHOP_GOODS_PRICE_INVALID(false, 20002, "商品价格非法"),//商品库存不足SHOP_GOODS_NUM_NOT_ENOUGH(false, 20003, "商品库存不足"),//扣减库存失败SHOP_REDUCE_GOODS_NUM_FAIL(false, 20004, "扣减库存失败"),//库存记录为空SHOP_REDUCE_GOODS_NUM_EMPTY(false, 20005, "扣减库存失败"),//用户账号不能为空SHOP_USER_IS_NULL(false, 30001, "用户账号不能为空"),//用户信息不存在SHOP_USER_NO_EXIST(false, 30002, "用户不存在"),//余额扣减失败SHOP_USER_MONEY_REDUCE_FAIL(false, 30003, "余额扣减失败"),//已经退款SHOP_USER_MONEY_REFUND_ALREADY(true, 30004, "订单已经退过款"),//优惠券不不存在SHOP_COUPON_NO_EXIST(false, 40001, "优惠券不存在"),//优惠券不合法SHOP_COUPON_INVALIED(false, 40002, "优惠券不合法"),//优惠券使用失败SHOP_COUPON_USE_FAIL(false, 40003, "优惠券使用失败"),//余额不能小于0SHOP_MONEY_PAID_LESS_ZERO(false, 50001, "余额不能小于0"),//余额非法SHOP_MONEY_PAID_INVALID(false, 50002, "余额非法"),//Topic不能为空SHOP_MQ_TOPIC_IS_EMPTY(false, 60001, "Topic不能为空"),//消息体不能为空SHOP_MQ_MESSAGE_BODY_IS_EMPTY(false, 60002, "消息体不能为空"),//消息发送失败SHOP_MQ_SEND_MESSAGE_FAIL(false,60003,"消息发送失败"),//支付订单未找到SHOP_PAYMENT_NOT_FOUND(false,70001,"支付订单未找到"),//支付订单已支付SHOP_PAYMENT_IS_PAID(false,70002,"支付订单已支付"),//订单付款失败SHOP_PAYMENT_PAY_ERROR(false,70002,"订单支付失败");Boolean success;Integer code;String message;ShopCode() {}ShopCode(Boolean success, Integer code, String message) {this.success = success;this.code = code;this.message = message;}public Boolean getSuccess() {return success;}public void setSuccess(Boolean success) {this.success = success;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "ShopCode{" +"success=" + success +", code=" + code +", message='" + message + '\'' +'}';}
}

4、响应实体类 :Result:封装响应状态和响应信息

在 shop-pojo 工程模块中,Result.java :是封装响应状态和响应信息的公共类。

package com.itheima.entity;import java.io.Serializable;/*** 结果实体类*/
public class Result implements Serializable {private Boolean success;private String message;public Result() {}public Result(Boolean success, String message) {this.success = success;this.message = message;}public Boolean getSuccess() {return success;}public void setSuccess(Boolean success) {this.success = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "Result{" +"success=" + success +", message='" + message + '\'' +'}';}
}

二、RocketMQ 实战:模拟电商网站场景综合案例 – 下单功能时序图

在这里插入图片描述

三、RocketMQ 实战:下单接口定义和编码步骤分析

1、下单基本流程:接口定义 IOrderService.java

在 shop-api 工程模块中,创建 IOrderService.java 下单接口类。


package com.itheima.api;import com.itheima.entity.Result;
import com.itheima.shop.pojo.TradeOrder;public interface IOrderService {/*** 下单接口* @param order* @return*/public Result confirmOrder(TradeOrder order);}

2、下单基本流程:业务类实现 OrderServiceImpl.java

在 shop-order-service 工程模块中,创建 OrderServiceImpl.java 业务实现类。
基本框架如下:


@Slf4j
@Component
@Service(interfaceClass = IOrderService.class)
public class OrderServiceImpl implements IOrderService {@Overridepublic Result confirmOrder(TradeOrder order) {//1.校验订单//2.生成预订单try {//3.扣减库存//4.扣减优惠券//5.使用余额//6.确认订单//7.返回成功状态} catch (Exception e) {//1.确认订单失败,发送消息//2.返回失败状态}}
}

四、RocketMQ 实战:模拟电商网站场景综合案例–校验订单流程分析图

在这里插入图片描述

五、RocketMQ 实战:模拟电商网站场景综合案例–校验订单实现

1、在 shop-order-service 工程模块中,创建 OrderServiceImpl.java 下单业务类,

完成 订单校验方法。


package com.itheima.shop.service;import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.itheima.api.ICouponService;
import com.itheima.api.IGoodsService;
import com.itheima.api.IOrderService;
import com.itheima.api.IUserService;
import com.itheima.constant.ShopCode;
import com.itheima.entity.MQEntity;
import com.itheima.entity.Result;
import com.itheima.exception.CastException;
import com.itheima.shop.mapper.TradeOrderMapper;
import com.itheima.shop.pojo.*;
import com.itheima.utils.IDWorker;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.math.BigDecimal;
import java.util.Date;@Slf4j
@Component
@Service(interfaceClass = IOrderService.class)
public class OrderServiceImpl implements IOrderService {@Referenceprivate IGoodsService goodsService;@Referenceprivate IUserService userService;@Overridepublic Result confirmOrder(TradeOrder order) {//1.校验订单checkOrder(order);//2.生成预订单try {//3.扣减库存//4.扣减优惠券//5.使用余额//6.确认订单//7.返回成功状态} catch (Exception e) {//1.确认订单失败,发送消息//2.返回订单确认失败消息return null;}}/*** 校验订单** @param order*/private void checkOrder(TradeOrder order) {//1.校验订单是否存在if (order == null) {CastException.cast(ShopCode.SHOP_ORDER_INVALID);}//2.校验订单中的商品是否存在TradeGoods goods = goodsService.findOne(order.getGoodsId());if (goods == null) {CastException.cast(ShopCode.SHOP_GOODS_NO_EXIST);}//3.校验下单用户是否存在TradeUser user = userService.findOne(order.getUserId());if (user == null) {CastException.cast(ShopCode.SHOP_USER_NO_EXIST);}//4.校验商品单价是否合法if (order.getGoodsPrice().compareTo(goods.getGoodsPrice()) != 0) {CastException.cast(ShopCode.SHOP_GOODS_PRICE_INVALID);}//5.校验订单商品数量是否合法if (order.getGoodsNumber() >= goods.getGoodsNumber()) {CastException.cast(ShopCode.SHOP_GOODS_NUM_NOT_ENOUGH);}log.info("校验订单通过");}
}

2、在 shop-api 工程模块中,创建 IGoodsService.java 接口类。


package com.itheima.api;import com.itheima.entity.Result;
import com.itheima.shop.pojo.TradeGoods;
import com.itheima.shop.pojo.TradeGoodsNumberLog;public interface IGoodsService {/*** 根据ID查询商品对象* @param goodsId* @return*/TradeGoods findOne(Long goodsId);}

3、在 shop-api 工程模块中,创建 IUserService.java 接口类。


package com.itheima.api;import com.itheima.entity.Result;
import com.itheima.shop.pojo.TradeUser;
import com.itheima.shop.pojo.TradeUserMoneyLog;public interface IUserService {TradeUser findOne(Long userId);Result updateMoneyPaid(TradeUserMoneyLog userMoneyLog);
}

4、在 shop-user-service 工程模块中,创建 UserServiceImpl.java 实现类。


package com.itheima.shop.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.api.IUserService;
import com.itheima.constant.ShopCode;
import com.itheima.entity.Result;
import com.itheima.exception.CastException;
import com.itheima.shop.mapper.TradeUserMapper;
import com.itheima.shop.mapper.TradeUserMoneyLogMapper;
import com.itheima.shop.pojo.TradeUser;
import com.itheima.shop.pojo.TradeUserMoneyLog;
import com.itheima.shop.pojo.TradeUserMoneyLogExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.math.BigDecimal;
import java.util.Date;@Component
@Service(interfaceClass = IUserService.class)
public class UserServiceImpl implements IUserService{@Autowiredprivate TradeUserMapper userMapper;@Autowiredprivate TradeUserMoneyLogMapper userMoneyLogMapper;@Overridepublic TradeUser findOne(Long userId) {if(userId==null){CastException.cast(ShopCode.SHOP_REQUEST_PARAMETER_VALID);}return userMapper.selectByPrimaryKey(userId);}}

5、在 shop-goods-service 工程模块中,创建 GoodsServiceImpl.java 实现类。


package com.itheima.shop.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.api.IGoodsService;
import com.itheima.constant.ShopCode;
import com.itheima.entity.Result;
import com.itheima.exception.CastException;
import com.itheima.shop.mapper.TradeGoodsMapper;
import com.itheima.shop.mapper.TradeGoodsNumberLogMapper;
import com.itheima.shop.pojo.TradeGoods;
import com.itheima.shop.pojo.TradeGoodsNumberLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Date;@Component
@Service(interfaceClass = IGoodsService.class)
public class GoodsServiceImpl implements IGoodsService {@Autowiredprivate TradeGoodsMapper goodsMapper;@Autowiredprivate TradeGoodsNumberLogMapper goodsNumberLogMapper;@Overridepublic TradeGoods findOne(Long goodsId) {if (goodsId == null) {CastException.cast(ShopCode.SHOP_REQUEST_PARAMETER_VALID);}return goodsMapper.selectByPrimaryKey(goodsId);}}

上一节关联链接请点击:
# RocketMQ 实战:模拟电商网站场景综合案例(五)

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

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

相关文章

前端加载 动画特效

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>加载动画</title><style type="text/css">/* 设置页面背景颜色 */body {background: #ECF0F1;}/* 定义加载动画容器的样式…

【SQL边干边学系列】05高级问题

文章目录 前言回顾高级问题32.高价值客户33.高价值的客户-总订单数34.高价值的客户-带有折扣35.月末订单36.具有许多详细信息行的订单 答案32.高价值客户33.高价值的客户-总订单数34.高价值的客户-带有折扣35.月末订单36.具有许多详细信息行的订单 未完待续 前言 该系列教程&am…

电子书资源汇总

更多资源关注公众号&#xff1a;阿宇的编程之旅&#xff0c;回复‘书签’获取 FreeMbook Search 网站名称&#xff1a;FreeMbook Search网址&#xff1a;FreeMbook Search介绍&#xff1a;一个提供电子书搜索和下载服务的网站。 超星书籍检索工具 网站名称&#xff1a;超星…

SSRF 漏洞检测:防范未然的关键

服务器端请求伪造&#xff08;SSRF&#xff09;是一种隐蔽且危险的安全漏洞&#xff0c;它允许攻击者欺骗服务器向其他服务器发送请求&#xff0c;从而访问或控制未经授权的系统。及时发现并修复 SSRF 漏洞对于保障系统安全至关重要。本文将介绍 SSRF 漏洞的检测方法&#xff0…

新品发布 | 捷云等保一体机2.0全新上市,助力中小企业破解等保难题

等保2.0时代&#xff0c;随着网络威胁不断复杂化和组织化&#xff0c;作为网络安全“弱势群体”的中小企业&#xff0c;等保建设工作正面临着安全意识、管理、人才、资金捉襟见肘等问题&#xff0c;主要体现在以下两个方面&#xff1a; 等保建设流程复杂 中小企事业单位缺乏专…

jvm学习笔记(二) ----- 垃圾回收

GC 一、判定对象是否是垃圾1.引用计数法2.可达性分析算法 二、垃圾回收算法1.标记清除2.标记整理3. 复制4. 分代垃圾回收1.尝试在伊甸园分配2.大对象直接晋升至老年代3.多次存活的对象4.老年代连续空间不足&#xff0c;触发 Full GC 链接: jvm学习笔记(一) ----- JAVA 内存 链接…

Spigot开发中的事件与监听器的关系

介绍Spigot开发中的监听器 在Spigot插件开发中&#xff0c;监听器&#xff08;Listener&#xff09;是一个非常重要的概念。它们允许你捕捉和处理各种游戏事件&#xff0c;使你的插件能够对玩家的行为、游戏环境的变化等做出响应。本文将详细介绍监听器是什么、它们的用途&…

select模块

Python标准库中的select模块&#xff0c;这个模块提供了select函数&#xff0c;它能够监视文件描述符&#xff0c;等待它们变得“就绪”&#xff08;即可读、可写或发生异常&#xff09;。这在处理I/O、网络通信或异步操作时非常有用。 select模块的基本使用 导入模块 impor…

能打印出一条虚线的程序

目录 开头程序程序输入与打印的效果输入输入1输入2 打印打印1打印2 流程图结尾 开头 大家好&#xff0c;我叫这是我58&#xff0c;现在&#xff0c;请你先看一下下面的程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() {int i 0;int ia…

解析智慧机场系统的架构与未来发展趋势

在全球航空业快速发展的背景下&#xff0c;智慧机场系统已经成为提升机场运营效率、优化旅客体验的重要手段。智慧机场系统的架构设计涵盖了多个方面&#xff0c;从航班管理到安全检查&#xff0c;从旅客服务到数据分析&#xff0c;都有着精心设计和完善的技术支持。本文将深入…

Apipost安装教程

&#x1f4d6;Apipost安装教程 ✅1. 下载✅2. 安装 ✅1. 下载 官网地址&#xff1a;https://www.apipost.cn/ 选择免费版&#xff0c;下载对应系统的安装包即可。 ✅2. 安装 1.点击运行apipost_win_x64_8.0.11.exe安装包&#xff0c;并选择用户安装&#xff0c;下一步 2.选…

【Kubernetes】Ingress 对外服务、ingress-controlle

Ingress 简介 service的作用体现在两个方面&#xff1a; 对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b; 对集群外部&#xff0c;他类似负载均衡器&#xff0c;可以在集群内…

架构演化过程中,如何确保核心功能不受影响?

在架构演化过程中确保核心功能不受影响是至关重要的。以下是一些策略和最佳实践&#xff0c;可以帮助在架构演化时保持核心功能的稳定性和可靠性&#xff1a; 明确核心功能&#xff1a;首先&#xff0c;需要清晰地定义哪些功能是核心的&#xff0c;这些功能对业务至关重要&…

java kotlin python 日志记录

Python中的日志记录 在Python项目中使用日志记录库&#xff0c;并限制日志文件大小为50MB&#xff0c;同时设置日志文件的滚动策略&#xff0c;使用logging库和logging.handlers.RotatingFileHandler。以下是具体步骤&#xff1a; 配置日志记录 创建一个日志配置文件&#x…

adb检测系统是否使用生产秘钥进行签名

系统签名检测 如果发现testkey.x509.pem就是开发版的系统&#xff0c;是不可信的&#xff0c;或者会被检测出来自定义ROM。 adb shell unzip -l /system/etc/security/otacerts.zip Archive: /system/etc/security/otacerts.zipLength Date Time Name --------- …

如何评估pcdn调度算法的优化效果(壹)

评估PCDN&#xff08;Peer-assisted Content Delivery Network&#xff0c;对等网络内容分发网络&#xff09;调度算法的优化效果是一个综合且系统的过程&#xff0c;涉及多个维度的考量。以下是一些建议的步骤和考量因素&#xff0c;以便全面评估优化效果&#xff1a; 一&…

服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景&#xff1a; 虚拟机上Ubuntu系统安装了Mysql&#xff0c;现在有一个服务应用需要使用docker来部署&#xff0c;服务应用需要连接mysql做数据库基础使用&#xff0c;配置文件中配置了虚拟主机的IP和端口&#xff0c;但是还是无法连接到Mysql&#xff0c;报错无法连接超…

stm32MP135裸机编程:修改基于SD卡的FSBL-A用户程序引导程序(boot)

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf stm32mp135官方开发板原理图&#xff08;mb1635-bdp-v1-0.zip&#xff09; STM32Cube_FW_MP13_V1.0.0 STM32CubeIDE v1.15 1 为什么需要修改FSBL-A用户程序引导程序 FSBL-A用户程序引导程序的作用在《…

v-for

v-for 是 Vue.js 框架中的一个重要指令&#xff0c;用于渲染列表或数组元素。它允许你在 HTML 元素上迭代一个数据集合&#xff0c;将每个数据项映射到一个或多个 DOM 元素中。使用 v-for 的基本语法如下&#xff1a; html <template> <ul> <li v-for&qu…

Spark 面试题(二)

1. 简述Spark的作业运行流程是怎么样的 &#xff1f; Apache Spark的作业运行流程涉及从作业提交到执行完成的一系列步骤&#xff0c;具体如下&#xff1a; 作业提交&#xff1a;用户编写的Spark应用程序通过Spark API提交给集群。这通常涉及到创建一个SparkContext对象&#…