【Lilishop商城】No2-6.确定软件架构搭建五(本篇包括定时任务xxl-job)

news2024/12/24 2:38:35

  仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在:

【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客


 全篇只介绍重点架构逻辑,具体编写看源代码就行,读起来也不复杂~

谨慎:源代码中有一些注释是错误的,有的注释意思完全相反,有的注释对不上号,我在阅读过程中就顺手更新了,并且在我不会的地方添加了新的注释,所以在读源代码过程中一定要谨慎啊!

目录

A1.定时任务xxl-job

B1.定时任务执行模块基本搭建

C1.测试

剩余内容:延时任务等


A1.定时任务xxl-job

xxl-job的简单介绍和使用:xxl-job快速入门指南-CSDN博客_xxljob入门

详细使用看这个:xxl-job详细使用指南-CSDN博客_xxl-job

重点就是两个概念:调度模块(调度中心)、执行模块(执行器);

调度模块重点就是负责管理调度信息的,有可视化平台,可以添加定时任务去执行,本身不含业务信息。

执行模块就是需要开发人员集成xxl-job模块,开发执行器业务即可。

B1.定时任务执行模块基本搭建

开始之前先说一下,调度模块的启动看上面文章这里就不介绍了,本来可以直接使用shop提供的xxl-jod里面的jar,但是启动时一直报错,这个错误又没法处理,所以直接下载了对应版本的源码包运行的~

Error: Invalid or corrupt jarfile /Users/hebrf/Desktop/projects/project/lilishop-master/xxl-job/xxl-job-admin-2.3.0-SNAPSHOT.jar

shop项目是直接在 consumer 模块添加定时任务的,我们在上一篇消息中间件里面也是新建了 consumer 模块,现在就可以直接加在里面的 timetask 业务就好。

先添加依赖,由于之后的这里也会有很多业务逻辑,所以直接依赖 framework 就可以。

/lilishop-master/consumer/pom.xml

    <dependencies>
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>${xxl-job}</version>
        </dependency>
    </dependencies>

然后在resource的配置文件application.xml中设置配置信息,设置调度中心接口等信息

# /lilishop-master/consumer/src/main/resources/application.yml

xxl:
  job:
    admin:
      # 调度中心的部署地址。若调度中心采用集群部署,存在多个地址,则用逗号分隔。执行器将会使用该地址进行”执行器心跳注册”和”任务结果回调”。
      addresses: http://127.0.0.1:9001/xxl-job-admin
    executor:
      # 执行器的应用名称,它是执行器心跳注册的分组依据。
      appname: xxl-job-executor-lilishop
      address:
      # 执行器的IP地址,用于”调度中心请求并触发任务”和”执行器注册”。执行器IP默认为空,表示自动获取IP。多网卡时可手动设置指定IP,手动设置IP时将会绑定Host。
      ip:
      # 执行器的端口号,默认值为9999。单机部署多个执行器时,注意要配置不同的执行器端口。
      port: 8891
      # 日志存放路径
      logpath: ./xxl-job/executor
      # 执行器日志文件的定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保存3天,否则功能不生效。
      logretentiondays: 7

然后配置执行器对象

//详见: cn.lili.timetask.config.XxlJobConfig

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

}

执行器添加之后,然后就可以添加执行的业务了,也就是任务。

我们可以看到shop里面的任务一共就三个 everyMinuteExecute 、everyHourExecuteJobHandler 、everyDayExecuteJobHandler ,分别是每分钟、每小时、每天执行定时任务。在shop项目的业务中,只会用到这三种定时任务,所以只添加三种任务就可以。

而每个任务里面会对应多个小业务的,我们不能直接将业务写在任务里面,耦合度高且代码又难读。所以就给每类任务添加了任务执行(就是业务)抽象接口, 每新增一个业务就实现对应的接口并创建bean,然后在任务处理类中注入抽象接口的List,那么任务方法执行时,会从list里面获取到业务,拿到就for循环执行业务~

接下来就开始写任务和业务啦

//给每类任务添加了任务执行(就是业务)抽象接口,就拿每分钟举例啦
//详见:cn.lili.timetask.handler.EveryMinuteExecute

public interface EveryMinuteExecute {
    /**
     * 执行
     */
    void execute();
}
//添加任务执行(业务)实现类,我们加上两个实现类来进行测试
//(这里注意,由于我不能在consumer模块中直接加,所以新创建了个consumer-test-xxl-job模块,定时任务都是在这个模块里面测试的,看代码的时候注意啊)
//详见:cn.lili.timetask.handle.impl.TestMinuteExecute1
//详见:cn.lili.timetask.handle.impl.TestMinuteExecute2

@Component
@Slf4j
public class TestMinuteExecute1 implements EveryMinuteExecute {
    @Override
    public void execute() {
        XxlJobHelper.log("TestMinuteExecute1");
        log.info("每分钟子任务执行:TestMinuteExecute1");
    }
}
//添加任务类
//详见:cn.lili.timetask.TimedTaskJobHandler

@Slf4j
@Component
public class TimedTaskJobHandler {

    /**
     * @Description: 将相同任务的业务放到一起执行
     **/
    @Autowired(required = false)
    private List<EveryMinuteExecute> everyMinuteExecutes;

    /**
     * 每分钟任务
     *
     * @throws Exception
     */
    @XxlJob("everyMinuteExecute")
    public ReturnT<String> everyMinuteExecute(String param)  {
        log.info("每分钟任务执行");
        if (everyMinuteExecutes == null || everyMinuteExecutes.size() == 0) {
            return ReturnT.SUCCESS;
        }

        for (int i = 0; i < everyMinuteExecutes.size(); i++) {
            try {
                everyMinuteExecutes.get(i).execute();
            } catch (Exception e) {
                log.error("每分钟任务异常", e);
            }
        }
        return ReturnT.SUCCESS;
    }
}

C1.测试

运行consumer模块前,先打开任务调度平台,添加一个执行器,此时执行器是没有OnLine 机器的

然后启动consumer模块,然后就可以看到有OnLine 机器啦

此时任务还不会执行,因为我们还没有添加任务,我们现在去添加任务,添加完成后记得启动任务,然后就可以看到任务执行啦

 定时任务添加完毕

剩余内容:延时任务等

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

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

相关文章

如何配置一台适合oc渲染器的电脑?

众所周知&#xff0c;Octane 是最流行的渲染引擎之一。此外&#xff0c;Octane 是一个 GPU 渲染引擎&#xff0c;它使用一种计算最终生成的图片的方法&#xff0c;试图达到照片般的真实感。Octane 是一种利用 GPU 技术的无偏渲染引擎&#xff0c;非常接近物理精度。一台好的 PC…

计算机组成原理习题课第三章-2(唐朔飞)

计算机组成原理习题课第三章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

天宇优配|平台助企“抱团出海” “小而美”中觅“先机”

天津华图轿车物流有限公司一批二手新能源车从连云港装船发往阿联酋迪拜。&#xff08;采访方针供图&#xff09; 最近&#xff0c;一笔100.8万美元的出口信誉稳妥保单融资借款&#xff0c;被划到了天津华图轿车物流有限公司的账户上。正值客户“下单”高峰期&#xff0c;这笔及…

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)&#xff08;一&#xff09; 本文目录&#xff1a; 一、【旋转的精灵女孩】案例运行效果 二、Three.js简介 三、Three.js代码正常运行显示条件 &#xff08;1&#xff09;不载入任何纹理贴图的网页 &#xff08;2&…

双十二蓝牙耳机啥牌子好?2022年度热销蓝牙耳机排名

这期双十二数码好物分享&#xff0c;工作室打算来跟大家说说蓝牙耳机这个话题&#xff0c;它已经成为出行必带的装备&#xff0c;上班族、学生党、游戏党都离不开蓝牙耳机。今年我们测评过数十款型号了&#xff0c;本期我们盘点了今年热销的蓝牙耳机排名&#xff0c;让大家直观…

【学习笔记】《Python深度学习》第五章:深度学习用于计算机视觉

文章目录1 卷积神经网络简介1.1 卷积运算1.2 最大池化运算2 在小型数据集上从头开始训练一个卷积神经网络2.1 下载数据2.2 构建网络2.3 数据预处理2.4 数据增强3 使用预训练的卷积神经网络3.1 特征提取3.2 微调模型3.3 小结4 卷积神经网络的可视化4.1 可视化中间激活4.2 可视化…

新手想开一个传奇该如何操作?开一个传奇必须掌握哪些知识要点

对于这个问题&#xff0c;近期问的人比较多&#xff0c;相比这也是热爱传奇这个游戏的朋友会问到的一个问题&#xff0c;因为喜欢玩这个游戏&#xff0c;也想要自己去开一个 经营一个 不管是电脑端也好 还是手机端也好&#xff0c;但是对于一些新手确实不知道该如何开始操作 从…

H3C opsf/rip/ftp/telent/nat/acl综合

实验拓扑 拓扑下载 https://sharewh2.xuexi365.com/share/84b85b32-acb7-4f62-a389-6188680a19f3?t3 图 1-1 注&#xff1a;如无特别说明&#xff0c;描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备&#xff0c;R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备…

三天入门Redis【快速浏览版】

文章目录第一天1.1 Redis基础1.1.1 NoSql引入1.1.2 NoSql特点1.1.3 NoSql数据库1.1.4 Redis概述1.1.5 Redis文件的作用1.1.6 Redis相关介绍1.2 常用的五大类型及操作⭐️1.2.1 Redis键&#xff08;key&#xff09;1.2.2 库的一些操作1.2.3 Redis字符串1.2.4 Redis列表&#xff…

MATLAB数据导入

MATLAB数据导入 在编写一个程序时&#xff0c;经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。 MATLAB中导入数据的方式有两种&#xff0c;分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第…

ASCHIP_ISP Tool 工具 使用与更新

系列文章目录 ASCHIP-ISP Tool 版本1 2022 11 26ASCHIP-ISP Tool 版本1 使用说明 2022 11 26 软件介绍 对窗体进行初步配置&#xff0c;配置其大小与显示 一&#xff1a;软件介绍 ASCHIP_ISP Tool 工具是用于具有 ISP 功能型号类型的单片机进行 ISP 更新程序开发实验的配套上位…

Lint-staged自动修复格式错误及小结

文章目录一、背景二、Lint-staged2.1 简介2.2 修改package.json2.3 修改pre-commit2.4 测试三、小结3.1 代码格式规范3.2 Git提交规范一、背景 通过前面几节的介绍&#xff0c;目前想要提交代码&#xff0c;就要保证代码格式规范和提交信息格式规范&#xff0c;特别是pre-subm…

vue设置页面背景及背景图片

本地静态图片 <template><view class"max"><image src"../../static/bg.png" mode""></image></view> </template><script>export default {data() {return {}},methods: {}} </script><st…

JavaEE之Cookie 和 Session 的工作流程

文章目录前言Cookie 和 Session 的核心方法Cookie 和 Session 的工作流程总结前言 HTTP涉及到的键值对: query string请求/响应的headerCookie里的内容form表单提交的bofyjson格式的body服务器存储若干个sessionId和HttpSession对象每个HttpSession对象本身里面又可以保存多个…

前景一片蓝海,Android音视频开发必备基础知识汇总

转瞬间&#xff0c;2022 已慢慢步入深冬&#xff0c;回首过去一年&#xff0c;音视频技术在经历一番风浪的侵袭过后&#xff0c;变得逐渐相对平静下来。 “内卷”之外&#xff0c;大家似乎更多了一份“理性”指导我们去做一些正确的事&#xff0c;追求技术在商业中的更高价值。…

数商云B2B商城系统订货功能为新能源汽车行业赋能,打造高质量发展生态圈

近年来&#xff0c;随着传统的汽车销售模式的信息不对称、价格不透明等问题日益凸显&#xff0c;汽车电商以其低成本的优势与高速的信息流通效率迅速发展。所谓汽车电商&#xff0c;即卖家与买家通过互联网的技术和手段&#xff0c;完成汽车售后各项服务的交易流程。根据数据显…

3.Linux文件管理命令-----ls显示文件名

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 作用&#xff1a;ls 命令用于显示目录内容&#xff0c;类似于 DOS 下的 dir 命令&#xff0c;它的使用权限是所有用户。 用法&#xff1a; ls [选项]...[文件]...1.LS应用实例如下…

数据结构 - 树 堆

树、堆是用于频繁插入、排序的数据结构。他是一种排序数据结构而不是排序算法。 堆和树是有区别的 堆&#xff1a;特殊的完全二叉树。“特殊”&#xff1a;数值上特殊&#xff0c;父比子大/小。 1. 为什么用它 书上给的例子有点奇怪&#xff1a; 他的意思是说&#xff1a;“…

mysql学习笔记1:忘记密码

我使用的mysql版本为&#xff1a;5.6.50&#xff0c;操作系统为&#xff1a;win10 一、修改配置文件my.ini 1、在C:\ProgramData\MySQL\MySQL Server 5.6文件夹下找到my.ini配置文件 2、设置权限认证跳过 找到[mysqld]&#xff0c;在下面这行代码的下面加上 skip-grant-tab…

成兴光 | LED灯珠的封装形式

​成兴光根据不同的应用场合、不同的外形尺寸、散热方案和发光效果。将LED封装形式分为&#xff1a;引脚式、功率型封装、贴片式&#xff08;SMD&#xff09;、板上芯片直装式&#xff08;COB&#xff09;、Chip-LED、UVC金属、陶瓷封装等七个段落讲述。 &#xff08;1&#xf…