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

ops/2024/10/18 12:19:13/

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_tokenexecutor:appname: sun-club-subjcet # 执行器名称address:ip: 127.0.0.1 # 执行器ipport: 9999 # 执行器端口logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 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 {// todolog.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 {@Resourceprivate SubjectLikedDomainService subjectLikedDomainService;/*** 同步点赞数任务*/@XxlJob("syncLikedJobHandler") // 这个注解是xxl-job的注解,用于标记这个方法是一个定时任务,必须跟执行器的运行模式一致public void demoJobHandler() throws Exception {XxlJobHelper.log("syncLikedJobHandler start");try {// 同步点赞数据到dbsubjectLikedDomainService.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);// 打日志,输出mapif (log.isInfoEnabled()) {log.info("syncLiked:{}", JSON.toJSONString(subjectLiked));}// 判空if (subjectLiked.isEmpty()) {return;}// 声明一个listList<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,这里是内网穿透的ipport: 9999 # 执行器端口,记得要开防火墙      logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 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.ppmy.cn/ops/94367.html

相关文章

leetcode 70. 爬楼梯

力扣 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。&#xff08;1 < n < 45&#xff09; 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 方法1: class Solution { public:int climbStairs(int n) {int s 0;if(n 1) ret…

基于springboot的二手车交易系统的设计与实现

TOC springboot172基于springboot的二手车交易系统的设计与实现 第1章 绪论** 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往…

随笔二、OV5695摄像头测试

摘要&#xff1a;泰山派开发板SDK使用了GStreamer媒体框架作为音视频的编解码器&#xff0c;支持硬件编解码。开发板提供MIPI_CSI摄像头接口连接摄像头。 1. 摄像头信息 开发板MIPI-CPI接口是30pin、4lane&#xff1b;测试用的OV5696是2lane&#xff0c;像素500万&#xff0c;…

Qt——多线程

一、QThread类 如果要设计多线程程序&#xff0c;一般是从QThread继承定义一个线程类&#xff0c;并重新定义QThread的虚函数 run() &#xff0c;在函数 run() 里处理线程的事件循环。 应用程序的线程称为主线程&#xff0c;创建的其他线程称为工作线程。主线程的 start() 函数…

数据操作语言(DML)

SQL常用语句--超实用&#xff01;&#xff01;&#xff01; 数据操作&#xff1a; 1.插入数据(数据需要一一对应) INSERT INTO employees (employee_id,name,age,department_id) VALUES(1,John Doe,30,5); 2.更新数据 UPDATE employees SET name Jane Doe WHERE employee_i…

【图论】并查集(Union-find Sets)

文章目录 前言一、并查集(Union-find Sets)基本概念基本操作步骤 二、并查集的操作步骤1. 初始化 init2. 查询 find、合并 union&#xff08;未进行路径压缩&#xff09;3. 查询 find、合并 union&#xff08;路径压缩&#xff09; 三、Kruskal 算法中 环 的判断并查集的使用 总…

leetcode线段树(2940. 找到 Alice 和 Bob 可以相遇的建筑)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑…

链表(哈希表,有序表)环形链表确定节点的方式

UnOrderedMap UnSortedMap --> C 哈希表&#xff08;无序组织&#xff09; 哈希表如果只有key 没有 value 是HashSet 哈希表如果有key 有 value 是HashMap 哈希表在使用的过程中所有的增删改查都是常数时间&#xff08;比较大&#xff09; 如果存放的是基础类型&#xf…