xxl-job定时任务同步点赞数据 + 内网穿透

news2024/12/24 7:20:23

1.xxl-job基本介绍

1.官方文档

https://www.xuxueli.com/xxl-job/

2.gitee

https://gitee.com/xuxueli0323/xxl-job

2.本地集成xxl-job

1.下载源码包

https://gitee.com/xuxueli0323/xxl-job/tree/6effc8b98f0fd5b5af3a7b6a8995bdcf30de69fc/

2.导入到项目中
1.作为模块导入

image-20240623165503162

2.使其成为maven项目

image-20240623165525811

3.创建数据库
1.打开xxl-job-admin的配置文件,查看要创建的数据库

image-20240623165759571

2.打开tables_xxl_job.sql

image-20240623165921745

3.执行sql脚本,创建数据库表

image-20240623170014312

image-20240623170024394

4.修改application.properties的数据库ip和端口为自己的
4.启动访问
1.启动

image-20240623171322607

2.本地访问

http://localhost:8080/xxl-job-admin/toLogin

账号密码 admin 123456

image-20240623171508039

image-20240623171650213

5.sun-club-subject配置xxl-job
1. application.yml
#  xxl-job配置
xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin # xxl-job-admin地址
    accessToken: default_token
    executor:
      appname: sun-club-subjcet # 执行器名称
      address:
      ip: 127.0.0.1 # 执行器ip
      port: 9999 # 执行器端口
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
2.创建跟配置文件执行器相同名字的执行器 sun-club-subjcet

image-20240623172313361

3.sun-club-domain引入依赖
        <!-- xxl-job -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.1</version>
        </dependency>
        <!-- 这里因为是domain层,没有引入springboot-context,所以才引入了一下 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.27</version>
        </dependency>
4.将配置类粘贴到sun-club-domain的配置包中

image-20240623172929126

5.重启xxl-job和sun-club-subject,发现节点可以注册成功!

image-20240623173336993

image-20240623173344240

6.新增定时任务
1.任务管理->新增

image-20240623173526311

2.配置

image-20240623173743143

3.com/sunxiansheng/subject/domain/job/SyncLikedJob.java
1.代码
package com.sunxiansheng.subject.domain.job;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 同步点赞数任务
 */
@Component
@Slf4j
public class SyncLikedJob {

    /**
     * 同步点赞数任务
     */
    @XxlJob("syncLikedJobHandler") // 这个注解是xxl-job的注解,用于标记这个方法是一个定时任务,必须跟执行器的运行模式一致
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("syncLikedJobHandler start");
        try {
            // todo
            log.info("123456");
        } catch (Exception e) {
            XxlJobHelper.log("syncLikedJobHandler error" + e.getMessage());
        }

    }
}
2.注意:@XxlJob中的内容必须跟新增定时任务的Handler一致

image-20240623174610584

3.重启subject模块
4.执行一次,查看控制台

image-20240623174748614

image-20240623174803567

5.启动定时任务,查看控制台

image-20240623174842271

image-20240623174907849

3.docker安装xxl-job

1.选定服务器

image-20240623175549181

2.拉取镜像
1.应该是镜像的问题

image-20240623175843280

2.配置一下镜像
1.首先找到daemon.json的位置
sudo find / -name "daemon.json" 2>/dev/null

image-20240623180738287

2.将其删除
rm -rf /etc/docker/daemon.json
3.编辑镜像源文件
vim /etc/docker/daemon.json
4.填写代理镜像仓库地址,将以下内容粘贴到daemon.json中
{
  "registry-mirrors": [
    "https://9cpn8tt6.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com",
    "https://reg-mirror.qiniu.com",
    "https://mirror.baidubce.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirrors.huaweicloud.com"
  ]
}

5.重启docker引擎
systemctl restart docker && systemctl status docker
3.重新拉取镜像
docker pull xuxueli/xxl-job-admin:2.4.0

image-20240623182322894

3.启动容器
  • -p 8088:8088:将容器的8088端口映射到主机的8088端口。
    • 左侧的 8088 是主机上的端口。
    • 右侧的 8088 是容器内的端口。
  • -v /tool/xxl-job/logs:/data/applogs:将主机目录 /tool/xxl-job/logs 挂载到容器的 /data/applogs 目录。
  • -v /tool/xxl-job/application.properties:/xxl-job/xxl-job-admin/src/main/resources/application.properties:将主机上的配置文件挂载到容器内指定路径。
  • -e PARAMS="...":使用环境变量 PARAMS 来传递启动参数。
  • --server.port=8088:设置服务的端口为8088。
  • --spring.datasource.url=jdbc:mysql://ip:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai:设置数据库连接URL。
  • --spring.datasource.username=root:设置数据库用户名为 root
  • --spring.datasource.password=88888:设置数据库密码为 88888
  • --name xxl-job-admin:为容器指定一个名字 xxl-job-admin
  • xuxueli/xxl-job-admin:2.4.0:指定使用的镜像和标签(版本)。这里使用的是 xuxueli/xxl-job-admin 镜像的 2.4.0 版本。
docker run -d \
    -p 8088:8088 \
    -v /tool/xxl-job/logs:/data/applogs \
    -v /tool/xxl-job/application.properties:/xxl-job/xxl-job-admin/src/main/resources/application.properties \
    -e PARAMS="--server.port=8088 \
    --spring.datasource.url=jdbc:mysql://ip:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai \
    --spring.datasource.username=root \
    --spring.datasource.password=88888 \
    --name xxl-job-admin \
    xuxueli/xxl-job-admin:2.4.0

4.开启端口8088
1.宝塔开启
systemctl start firewalld && firewall-cmd --permanent --add-port=8088/tcp && firewall-cmd --reload && firewall-cmd --query-port=8088/tcp

image-20240623183107562

2.腾讯云开启

image-20240623183252686

5.测试访问

http://ip:8088/xxl-job-admin/toLogin 账号密码 admin 123456

image-20240623183416397

image-20240623183438614

6.修改sun-club-subject的application.yml
1.修改addresses为xxl-job的ip端口
2.执行器的ip和端口为sun-club-subject服务部署的地方,记得要开启9999端口的防火墙!!!!!!

4.redis的hash扫描同步点赞数据

1.sun-club-domain
1.RedisUtil.java 根据key来将每一个hashKey和hashValue转换为Map类型
/**
 * Redis中的hash类型,根据key来将每一个hashKey和hashValue转换为Map类型
 * @param key
 * @return
 */
public Map<Object, Object> getHashAndDelete(String key) {
    Map<Object, Object> map = new HashMap<>();
    // 扫描hash,指定每一个Entry的类型,这里返回的就是Map的游标,可以进行遍历
    Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan(key, ScanOptions.NONE);
    // 遍历每一条数据,放到map中
    while (cursor.hasNext()) {
        Map.Entry<Object, Object> next = cursor.next();
        Object hashKey = next.getKey();
        Object hashValue = next.getValue();
        map.put(hashKey, hashValue);
        // 每遍历一条就删除
        redisTemplate.opsForHash().delete(key, hashKey);
    }
    return map;
}
2.SyncLikedJob.java
package com.sunxiansheng.subject.domain.job;

import com.sunxiansheng.subject.domain.service.SubjectLikedDomainService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 同步点赞数任务
 */
@Component
@Slf4j
public class SyncLikedJob {

    @Resource
    private SubjectLikedDomainService subjectLikedDomainService;

    /**
     * 同步点赞数任务
     */
    @XxlJob("syncLikedJobHandler") // 这个注解是xxl-job的注解,用于标记这个方法是一个定时任务,必须跟执行器的运行模式一致
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("syncLikedJobHandler start");
        try {
            // 同步点赞数据到db
            subjectLikedDomainService.syncLiked();
        } catch (Exception e) {
            XxlJobHelper.log("syncLikedJobHandler error" + e.getMessage());
        }

    }
}
3.SubjectLikedDomainServiceImpl.java 将从redis中拿到的点赞数据同步到数据库
@Override
public void syncLiked() {
    Map<Object, Object> subjectLiked = redisUtil.getHashAndDelete(SUBJECT_LIKE_KEY);
    // 打日志,输出map
    if (log.isInfoEnabled()) {
        log.info("syncLiked:{}", JSON.toJSONString(subjectLiked));
    }
    // 判空
    if (subjectLiked.isEmpty()) {
        return;
    }
    // 声明一个list
    List<SubjectLiked> subjectLikedList = new ArrayList<>();
    // 将map中的数据转换为实体类并添加到list中
    subjectLiked.forEach((k, v) -> {
        String[] keys = k.toString().split(":");
        SubjectLiked subjectLiked1 = new SubjectLiked();
        subjectLiked1.setSubjectId(Long.valueOf(keys[0]));
        subjectLiked1.setLikeUserId(keys[1]);
        subjectLiked1.setStatus(Integer.valueOf(v.toString()));
        subjectLikedList.add(subjectLiked1);
    });
    // 调用service的批量插入方法
    subjectLikedService.batchInsert(subjectLikedList);
}

5.内网穿透natapp测试定时任务

1.内网穿透使用指南

https://natapp.cn/article/natapp_newbie

2.注册

https://natapp.cn/register

3.配置
1.购买免费隧道

https://natapp.cn/tunnel/buy

image-20240608142111985

image-20240608142322173

2.进入隧道

image-20240608142516414

3.配置端口为定时任务执行器的端口9999

image-20240624134303484

4.下载客户端

https://natapp.cn/#download

image-20240608142732200

5.启动
1.进入客户端exe文件的cmd

image-20240608142756385

2.找到自己的authtoken,输入命令启动
start natapp -authtoken 05a35b22673e2788

image-20240624134347540

6.application-test.yml 配置执行器的ip和端口

image-20240624134733993

#  xxl-job配置
xxl:
  job:
    executor:
      appname: sun-club-subjcet # 执行器名称
      address:
      ip: xh7set.natappfree.cc # 执行器ip,该模块的部署ip,这里是内网穿透的ip
      port: 9999 # 执行器端口,记得要开防火墙      
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
7.进行同步测试
1.以测试环境启动项目

2.查看redis的点赞数据

image-20240624135312052

3.进入xxl-job,执行一次任务

http://ip:8088/xxl-job-admin/toLogin 账号密码 admin 123456

4.发现连接被拒绝了
1.调度日志

image-20240624140130544

2.关闭本机防火墙

image-20240624140430681

3.发现还是不行,原因是内网穿透需要手动录入内网穿透的ip,则直接会映射ip+端口,如果自动映射还会在后面加9999端口,这样就不对了

image-20240624144814149

4.内网穿透再说明
1.内网穿透在配置ip和端口的时候正常配置
2.但是如果访问的话,直接访问内网穿透的ip即可,这个就包含了端口,不要再加端口!!!
5.定时任务执行成功!

image-20240624144949008

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

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

相关文章

【待修改】使用GraphRAG+LangChain+Ollama(LLaMa 3.1)知识图谱与向量数据库集成(Neo4j)

如何使用 LLama 3.1(一个本地运行的模型)来执行GraphRAG操作,总共就50号代码。 首先,什么是GraphRAG?GraphRAG是一种通过考虑实体和文档之间的关系来执行检索增强生成的方式,关键概念是节点和关系。 ▲ 知识图谱与向量数据库集成 知识图谱与向量数据库集成是GraphRAG 架…

121 买卖股票的最佳时机

解题思路&#xff1a; \qquad 这个题如果把每一种买卖的可能都算出来的解法时间复杂度在 O ( n 2 ) O(n^2) O(n2)&#xff0c;提交后会超时&#xff0c;所以需要在此基础上进行优化&#xff0c;能否通过一次遍历找出最大利润。 \qquad 对于当前点i&#xff0c;卖出股票所能得…

子域名下部署Java项目到docker中

场景&#xff1a;子域名需要部署Java项目&#xff0c;用于分公司的项目&#xff0c;可支持自定义功能。 拷贝总公司的后台代码 新增数据库并且修改配置环境的数据库连接 启动项目没问题后进行打包 目前我的是打成 jar包 服务器上创建文件&#xff0c;并且创建 dockerfile 文…

springboot整合activity7(一)

一、Spring Boot 集成 Activiti7&#xff08;工作流&#xff09; 此章节首先完成后端的activiti整合&#xff0c;生成工作流所需数据库表&#xff0c;数据库采用mysql。 二、依赖 <dependencies><!-- 引入Activiti7 --><dependency><groupId>org.ac…

080:vue+mapbox中interpolate 的详细解释

在Mapbox GL JS中,你可以使用样式表达式来实现数据驱动的样式,其中interpolate表达式是用于创建平滑过渡的一种方式。当你需要根据某个属性的值来动态地设置样式时,比如颜色、宽度或其他样式属性,interpolate表达式就非常有用。 文章目录 示例效果配置方式示例源代码(共14…

Manim的一个用于数学动画的 Python 库中渲染代码的功能。

Code 函数是 Manim&#xff08;一个强大的数学动画库&#xff09;中的一个重要工具&#xff0c;旨在将代码片段以视觉化的方式呈现。在教育和演示场合中&#xff0c;向观众展示算法或代码逻辑时&#xff0c;清晰的视觉效果是必不可少的。通过 Code 函数&#xff0c;用户可以轻松…

KOLA: CAREFULLY BENCHMARKING WORLD KNOWLEDGE OF LARGE LANGUAGE MODELS

文章目录 题目摘要简介KOLA 基准实验评估结论和未来工作道德声明 题目 KOLA&#xff1a;仔细对大型语言模型的世界知识进行基准测试 论文地址:https://arxiv.org/abs/2306.09296 项目地址:https://github.com/ranahaani/GNews 摘要 大型语言模型 (LLM) 的卓越性能要求评估方法…

【种草官招募令】

&#x1f31f; 你是时尚达人吗&#xff1f; 对潮流服饰有着独到的见解&#xff1f; 想通过分享赢得关注&#xff0c;还能赚取丰厚报酬&#xff1f; 来加入我们的电商种草官行列吧&#xff01; &#x1f457; 我们致力于发现和培养更多热爱时尚、善于种草的你&#xff0c;将…

Imagination CPU系列研讨会|RISC-V平台的性能分析和调试

为了让开发者及工程师深入了解 Imagination 的 CPU 产品及相关解决方案&#xff0c;Imagination 将陆续推出 5 期线上研讨会&#xff0c;包含 RISC-V 平台的性能分析和调试&#xff1b;RISC-V 安全和全球平台可信执行环境&#xff08;TEE&#xff09;&#xff1b;RISC-V 软件生…

人工智能缺陷检测方案METIS(梅迪斯):汽车零部件检测

#汽车零部件#机器视觉检测&#xff0c;作为当今科技领域的热门话题&#xff0c;正日益受到世人的瞩目。随着机器视觉系统的不断开发与优化&#xff0c;那些繁重而复杂的人工检测工作&#xff0c;已经逐渐被机器视觉检测所替代。今天&#xff0c;我们就来深入探讨一下&#xff0…

作业08.13

一、TCP机械臂测试 通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 注意&#xff1a;关闭计算机的杀毒软件&#xff0c;电脑管家&#xff0c;防火墙 1&#x…

构建实时数据仓库:流式处理与实时计算技术解析

目录 一、流式处理 请求与响应 批处理 二、实时计算 三、Lambda架构 Lambda架构的缺点 四、Kappa架构 五、实时数据仓库解决方案 近年来随着业务领域的不断拓展&#xff0c;尤其像互联网、无线终端APP等行业应用的激增&#xff0c;产生的数据量呈指数级增长&#xff0c;对海量数…

C++系列-继承中的对象模型

继承中的对象模型 通过查看子类的内存大小通过Developer Command Prompt查看结构 山中问答 李白 〔唐代〕 问余何意栖碧山&#xff0c;笑而不答心自闲。 桃花流水窅然去&#xff0c;别有天地非人间。 无论哪种继承方式&#xff0c;父类中的private成员在子类中均不可以访问。pu…

Polars简明基础教程十二:可视化(二)

设置绘图后端 我们可以使用 hv.extension 更改绘图后端。但是&#xff0c;我们不在此处运行此单元格&#xff0c;因为它会导致下面的 Matplotlib/Seaborn 图表无法渲染。 注释&#xff1a; hvPlot 利用 HoloViews 库来构建图表&#xff0c;并且可以使用多个后端进行渲染&…

农业物联网6公里WiFi远距离传输模块,信号传输不再受限,抗干扰、连接快

在数字化时代&#xff0c;WiFi已成为我们生活中不可或缺的一部分。然而&#xff0c;你是否曾遇到过这样的困扰&#xff1a;在户外或大型场所&#xff0c;WiFi信号总是那么微弱&#xff0c;甚至完全无法连接。这时候&#xff0c;一种能够实现6公里远距离WiFi传输的神秘模块便应运…

go-zero中间件的使用

一、自定义中间件 1、在api中在服务中定义一个中间件,名字随便取 type PostDemoReq {Name string json:"name" validate:"required" // 姓名Age int64 json:"age" validate:"required,gte1,lte130" // 年龄// optional 表示可选,omi…

RAG与LLM原理及实践(11)--- Milvus hybrid search 源码分析及思想

目录 背景 hybrid search 源码分析 WeightedRanker 源码 hybrid search 核心 参数详解 基本入参 扩展入参 aysnc方式代码调用案例 说明 源码逻辑 prepare 调用过程 stub 调用结果 stub 调用过程 blocking 与 async 调用方式 深入内部core weightedRanker 的ch…

拼图小游戏单机版---java实现

一、为什么要在这个阶段做这样的一个项目&#xff1f; 1、理解Swing框架&#xff1a; 这个项目使用了Swing框架来构建图形用户界面&#xff08;GUI&#xff09;。通过实践&#xff0c;你可以更好地掌握如何使用Swing组件&#xff08;如JFrame, JLabel, JMenuBar等&#xff09;…

Redis20-通信协议

目录 RESP协议 概述 数据类型 模拟Redis客户端 RESP协议 概述 Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;server&#xff09;发送一条命…

6RA8075-6DV62-0AA0模块可面价

6RA8075-6DV62-0AA0模块可面价 6RA8075-6DV62-0AA0模块可面价 6RA8075-6DV62-0AA0模块可面价 6ES7655-5DX40-2AA0模块接线图 6ES7655-5DX40-2AA0模块说明书 6ES7655-5DX40-2AA0模块选型手册 6ES7655-5DX40-2AA0功能模块是指数据说明、可执行语句等程序元素的集合&#xf…