文章目录

  • 一、使用docker-compose部署xxl-job-admin
  • 二、SpringBoot整合XXL-JOB
  • 三、测试报警邮件
  • 四、测试GLUE(java)模式
  • 五、测试GLUE(shell)模式
  • 六、xxl-job与quartz的异同

一、使用docker-compose部署xxl-job-admin

#在服务器新建一个目录
mkdir /www/xxl-job#安装docker-compose
yum install docker-compose#拉取镜像
git clone https://gitee.com/zhengqingya/docker-compose.git
cd docker-compose/Liunx

修改/www/xxl-job/docker-compose/Linux/xxl-job下的docker-compose-xxl-job.yml配置文件

# 运行
docker-compose -f docker-compose-xxl-job.yml -p xxl-job up -d


这样就启动成功了

然后去云服务器的安全组开放端口9003/9999,后面会使用到这两个端口

访问地址:http://ip地址:9003
默认登录账号密码:admin/123456

注:此容器方式部署,需要将执行器管理中的机器地址修改为部署的服务器ip

appname和端口号在配置文件中配的,写错了执行任务会报错,如下图,遇到这个错先去看执行器里面配的端口和配置文件中的是否一样


打开数据库,新建xxl-job数据库,执行语句

#
# XXL-JOB v2.3.0
# Copyright (c) 2015-present, xuxueli.CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `xxl_job`;SET NAMES utf8mb4;CREATE TABLE `xxl_job_info` (`id` int(11) NOT NULL AUTO_INCREMENT,`job_group` int(11) NOT NULL COMMENT '执行器主键ID',`job_desc` varchar(255) NOT NULL,`add_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,`author` varchar(64) DEFAULT NULL COMMENT '作者',`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',`schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',`schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',`misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',`glue_source` mediumtext COMMENT 'GLUE源代码',`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`job_group` int(11) NOT NULL COMMENT '执行器主键ID',`job_id` int(11) NOT NULL COMMENT '任务,主键ID',`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',`trigger_code` int(11) NOT NULL COMMENT '调度-结果',`trigger_msg` text COMMENT '调度-日志',`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',`handle_code` int(11) NOT NULL COMMENT '执行-状态',`handle_msg` text COMMENT '执行-日志',`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',PRIMARY KEY (`id`),KEY `I_trigger_time` (`trigger_time`),KEY `I_handle_code` (`handle_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_log_report` (`id` int(11) NOT NULL AUTO_INCREMENT,`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_logglue` (`id` int(11) NOT NULL AUTO_INCREMENT,`job_id` int(11) NOT NULL COMMENT '任务,主键ID',`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',`glue_source` mediumtext COMMENT 'GLUE源代码',`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',`add_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_registry` (`id` int(11) NOT NULL AUTO_INCREMENT,`registry_group` varchar(50) NOT NULL,`registry_key` varchar(255) NOT NULL,`registry_value` varchar(255) NOT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_group` (`id` int(11) NOT NULL AUTO_INCREMENT,`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',`title` varchar(12) NOT NULL COMMENT '执行器名称',`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',`address_list` text COMMENT '执行器地址列表,多地址逗号分隔',`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '账号',`password` varchar(50) NOT NULL COMMENT '密码',`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',PRIMARY KEY (`id`),UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `xxl_job_lock` (`lock_name` varchar(50) NOT NULL COMMENT '锁名称',PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');commit;

二、SpringBoot整合XXL-JOB

新建项目Springboot-xxljob
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cong</groupId><artifactId>springboot-xxljob</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-xxljob</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

XxlJobConfig.java

package com.cong.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class XxlJobConfig {@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;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {log.info(">>>>>>>>>>> xxl-job config init.");// 创建 XxlJobSpringExecutor 执行器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;}}

SampleXxlJob.java

package com.cong.jobhandler;import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;/*** XxlJob开发示例(Bean模式)* <p>* 开发步骤: 1、任务开发:在Spring Bean实例中,开发Job方法; 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init =* "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 3、执行日志:需要通过* "XxlJobHelper.log" 打印执行日志; 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过* "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;** @author xuxueli 2019-12-11 21:52:51*/
@Slf4j
@Component
public class SampleXxlJob {/*** 1、简单任务示例(Bean模式)*/@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobHelper.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}// default success}
}

然后打包项目

放到服务器/www/xxl-job/docker-compose/Linux/xxl-job

#后台启动项目
nohup java -jar /www/xxl-job/docker-compose/Linux/xxl-job/springboot-xxljob-0.0.1-SNAPSHOT.jar >/www/xxl-job/docker-compose/Linux/xxl-job/springboot-xxljob.log &

打开xxl-job后台,新增任务

配置属性详细说明:

#详细文档:https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0XXL-JOB%E3%80%8B基础配置:- 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;- 任务描述:任务的描述信息,便于任务管理;- 负责人:任务的负责人;- 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;
触发配置:- 调度类型:无:该类型不会主动触发调度;CRON:该类型将会通过CRON,触发任务调度;固定速度:该类型将会以固定速度,触发任务调度;按照固定的间隔时间,周期性触发;固定延迟:该类型将会以固定延迟,触发任务调度;按照固定的延迟时间,从上次调度结束后开始计算延迟时间,到达延迟时间后触发下次调度;- CRON:触发任务执行的Cron表达式;- 固定速度:固定速度的时间间隔,单位为秒;- 固定延迟:固定延迟的时间间隔,单位为秒;
任务配置:- 运行模式:BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 "JobHandler" 属性匹配执行器中任务;GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 "groovy" 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务;GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "shell" 脚本;GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "python" 脚本;GLUE模式(PHP):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "php" 脚本;GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "nodejs" 脚本;GLUE模式(PowerShell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "PowerShell" 脚本;- JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHandler”注解自定义的value值;- 执行参数:任务执行所需的参数;
高级配置:- 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;FIRST(第一个):固定选择第一个机器;LAST(最后一个):固定选择最后一个机器;ROUND(轮询):;RANDOM(随机):随机选择在线的机器;CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;- 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。- 调度过期策略:- 忽略:调度过期后,忽略过期的任务,从当前时间开始重新计算下次触发时间;- 立即执行一次:调度过期后,立即执行一次,并从当前时间开始重新计算下次触发时间;- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;- 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;- 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;



查看日志:


然后就可以启动任务,让他定时调度了


可以看到定时调度成功

三、测试报警邮件

1.拿到qq邮箱的授权码



未开启的点击开启,按步骤获取授权码,已开启的点击关闭,再点击开启,按步骤获取授权码,然后在修改配置文件



然后重启xxl-job-admin服务

[root@cong xxl-job]# docker-compose restart xxl-job
ERROR: The Compose file './../../docker-compose.yml' is invalid because:
services.yl3.ports is invalid: Invalid port "xx:xx", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
[root@cong xxl-job]# docker-compose -f docker-compose-xxl-job.yml -p xxl-job up -d
Recreating xxl-job-admin ... done

在后台配置报警邮箱


保存后,然后想办法弄出个错,如下改一下端口号,然后启动任务:


报错了,查看邮箱


至此,报警邮箱配置成功

四、测试GLUE(java)模式

新增任务



然后保存,执行一次,查看日志

五、测试GLUE(shell)模式

新增任务

GLUE编辑

#!/bin/bash
echo "xxl-job: hello shell"echo "脚本位置:$0"
echo "任务参数:$1"
echo "分片序号 = $2"
echo "分片总数 = $3"cd /www/xxl-job/docker-compose/Linux/xxl-job
echo 111112222223333333 >a.txt
echo "Good bye!"
exit 0

保存,执行,查看结果

六、xxl-job与quartz的异同

整体来说,xxl-job就是quartz的一个增强版,其弥补了quartz不支持并行调度,不支持失败处理策略和动态分片的策略等诸多不足,同时其有管理界面,上手比较容易,支持分布式,适用于分布式场景下的使用。两者相同的是都是通过数据库锁来控制任务不能重复执行。

xxl-job的学习使用相关推荐

  1. xxl子任务_阿里面试官:聊一下分布式任务调度有那些解决方案?

    作者:黄兆平 来源:http://blog.freshfood.cn/article/39 # 简介 随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务 ...

  2. 本周学习总结(ng-zorro/MDN索引/读书笔记)

    按钮 <button ng-button nzType="primary">Primary</button> nzType="" pri ...

  3. 博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 博通 ...

  4. Redis学习总结(数据类型、持久化、事务、数据删除策略、主从复制、哨兵、缓存雪崩等)

    Redis学习总结 1.Redis是什么 1.概念 2.特点 3.应用场景 2.Linux环境安装redis 3.Redis的数据存储格式 1.String类型 1.String类型的常用操作 2.S ...

  5. iview学习帮助文档

    安装iview npm install view-design --save 导入iview 在main.js中导入iview import ViewUI from 'view-design'; im ...

  6. 【定时任务】xxl-job框架学习笔记

    注: 本文为定时任务框架xxl-job的参考手册, 本文仅做了内容标注.整理.去除冗余内容,以方便个人查阅. 请读者执行前往官方查看官方手册https://www.xuxueli.com/xxl-jo ...

  7. 学习笔记 | 独热编码(One-Hot Encoding)

    最近学习机器学习,接触到独热编码相关内容,参考了一些资料,加上自己的思考,做出了如下总结. 一.什么是独热编码 独热编码,即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个 ...

  8. 【学习笔记】超实数(Surreal Number)和不平等博弈

    前言 最近在学习超实数.太难了.让人疯狂,也让人痴狂.matrix67matrix67matrix67 果然是战神,早就研究过这东西了.他的文章里有这样一句话,让我感受颇深: 正如 Poincareˊ ...

  9. xxl-job学习,基本测试1

    xxl-job 写在前面 特别注意 一.环境搭建 1.1.部署 1.2.基于注册中心,自定义项目中引入xxl-job 二.搭建完成,测试任务参数,执行机制等 2.1.页面配置任务,包括启动条件 2.1 ...

  10. Xxl Job Helloworld

    刚到新公司不久,新公司使用分布式任务调度平台是 xxl-job.其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用.当然它的特性在 它的官网 描述得非 ...

最新文章

  1. 七牛云 php sdk 安装,linux下Composer安装,通过Composer安装七牛云SDK
  2. VTK:绘制bottle瓶子用法实战
  3. 阿里云重磅发布RDS for SQL Server AlwaysOn集群版
  4. 【数据库系统】数据库与SQL
  5. Oracle设置和修改system和scott的口令,并且如何连接到system和scott模式下
  6. html漩涡源码,html5 canvas多边形漩涡
  7. Nacos 新增命名空间
  8. 开源、绿色,解压即可运行的数据库连接工具推荐
  9. win7下maven安装
  10. 基于JavaSwing开发中国象棋对战游戏+实验报告 课程设计 大作业
  11. matlab image反色,Matlab读入PNG图像后自动反色现象解释
  12. OKR:目标要定性,关键结果要定量
  13. python打印输出世界你好!,Python语句 print(\世界,你好”)的输出是?
  14. android 画尖角气泡,Android 实现气泡布局/弹窗,可控制气泡尖角方向及偏移量
  15. ubuntu 安装teamviewer
  16. MySQL八股文连环45问,你能坚持第几问?
  17. 一次哔哩哔哩面试经历
  18. windows server ----域(D)的创建
  19. python微信群管理_利用python实现在微信群刷屏的方法
  20. Unity(如何把方形图片整成圆形)

热门文章

  1. 使用web3.py获取zkSync中的数据
  2. C语言算法训练学做菜,Java实现 蓝桥杯VIP 算法训练 学做菜
  3. Oracle 发送QQ邮件监控定时任务
  4. gentoo的安装坑
  5. 莫队算法 --算法竞赛专题解析(26)
  6. 阳春三月,激情飞扬,c/c++0313就业班开班啦!
  7. 【第一组】第五次冲刺例会纪要
  8. World中利用宏命令批量删除页眉和页脚(亲测好用!)
  9. easypanel mysql错误_kangle easypanel面板安装后初始化教程
  10. 嗅探技术---网络安全入门笔记DAY5