Quartz数据库表分析

article/2025/8/22 13:37:18

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

系列文章

Spring整合Quartz分布式调度

Quartz数据库表分析

Quartz调度源码分析

前言

上一篇文章Spring整合Quartz分布式调度介绍了Quartz通过数据库的方式来实现分布式调度,通过使用数据库来存储trigger,job等信息,可以在停服重启的时候重新加载上次trigger的状态,保证了完整性;另一方面通过数据库来实现锁机制来实现分布式调度;Quartz默认提供了11张表,本文将对这几张表做简要的分析。

表信息

1.qrtz_blob_triggers
2.qrtz_cron_triggers
3.qrtz_simple_triggers
4.qrtz_simprop_triggers
5.qrtz_fired_triggers
6.qrtz_triggers
7.qrtz_job_details
8.qrtz_calendars
9.qrtz_paused_trigger_grps
10.qrtz_scheduler_state
11.qrtz_locks

共11张表,前6张都是关于各种triggers的信息,后面包括job,悲观锁,调度状态等信息;相关表操作在类StdJDBCDelegate中,相关sql语句在StdJDBCConstants中;

1.qrtz_blob_triggers

自定义的triggers使用blog类型进行存储,非自定义的triggers不会存放在此表中,Quartz提供的triggers包括:CronTrigger,CalendarIntervalTrigger,
DailyTimeIntervalTrigger以及SimpleTrigger,这几个trigger信息会保存在后面的几张表中;

2.qrtz_cron_triggers

存储CronTrigger,这也是我们使用最多的触发器,在配置文件中做如下配置,即可在qrtz_cron_triggers生成记录:

<bean id="firstCronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="firstTask" /><property name="cronExpression" value="0/6 * * ? * *" /><property name="group" value="firstCronGroup"></property>
</bean>
<bean id="firstTask"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="zh.maven.SQuartz.task.FirstTask" /><property name="jobDataMap"><map><entry key="firstService" value-ref="firstService" /></map></property>
</bean>
<bean id="firstService" class="zh.maven.SQuartz.service.FirstService"></bean>

表达式指定了每隔6秒执行一次,然后指定了要执行的task,task指定了要执行的业务,运行之后可以查看数据表:

mysql> select * from qrtz_cron_triggers;
+-------------+------------------+----------------+-----------------+---------------+
| SCHED_NAME  | TRIGGER_NAME     | TRIGGER_GROUP  | CRON_EXPRESSION | TIME_ZONE_ID  |
+-------------+------------------+----------------+-----------------+---------------+
| myScheduler | firstCronTrigger | firstCronGroup | 0/6 * * ? * *   | Asia/Shanghai |
+-------------+------------------+----------------+-----------------+---------------+

myScheduler是在定义SchedulerFactoryBean时指定的名称,其他字段都可以在上面的配置中找到;

3.qrtz_simple_triggers

存储SimpleTrigger,在配置文件中做如下配置,即可在qrtz_simple_triggers生成记录:

<bean id="firstSimpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"><property name="jobDetail" ref="firstSimpleTask" /><property name="startDelay" value="1000" /><property name="repeatInterval" value="2000" /><property name="repeatCount" value="5"></property><property name="group" value="firstSimpleGroup"></property>
</bean>
<bean id="firstSimpleTask"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="zh.maven.SQuartz.task.SimpleFirstTask" /><property name="jobDataMap"><map><entry key="firstService" value-ref="simpleFirstService" /></map></property>
</bean>
<bean id="simpleFirstService" class="zh.maven.SQuartz.service.SimpleFirstService"></bean>

指定了开始延迟时间,重复间隔时间已经重复的次数限制,查看表如下:

mysql> select * from qrtz_simple_triggers;
+-------------+--------------------+------------------+--------------+-----------------+-----------------+
| SCHED_NAME  | TRIGGER_NAME       | TRIGGER_GROUP    | REPEAT_COUNT | REPEAT_INTERVAL | TIMES_TRIGGERED |
+-------------+--------------------+------------------+--------------+-----------------+-----------------+
| myScheduler | firstSimpleTrigger | firstSimpleGroup |            5 |            2000 |               1 |
+-------------+--------------------+------------------+--------------+-----------------+-----------------+

TIMES_TRIGGERED用来记录执行了多少次了,此值被定义在SimpleTriggerImpl中,每次执行+1,这里定义的REPEAT_COUNT=5,实际情况会执行6次,具体可以查看SimpleTriggerImpl源码:

public Date getFireTimeAfter(Date afterTime) {if (complete) {return null;}if ((timesTriggered > repeatCount)&& (repeatCount != REPEAT_INDEFINITELY)) {return null;}......
}

timesTriggered默认值为0,当timesTriggered > repeatCount停止trigger,所以会执行6次,当执行完毕之后此记录会被删除;

4.qrtz_simprop_triggers

存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器,使用CalendarIntervalTrigger做如下配置:

<bean id="firstCalendarTrigger" class="org.quartz.impl.triggers.CalendarIntervalTriggerImpl"><property name="jobDataMap"><map><entry key="jobDetail" value-ref="firstCalendarTask"></entry></map></property><property name="key" ref="calendarTriggerKey"></property><property name="repeatInterval" value="1" /><property name="group" value="firstCalendarGroup"></property>
</bean>
<bean id="firstCalendarTask"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="zh.maven.SQuartz.task.CalendarFirstTask" /><property name="jobDataMap"><map><entry key="firstService" value-ref="calendarFirstService" /></map></property>
</bean>
<bean id="calendarFirstService" class="zh.maven.SQuartz.service.CalendarFirstService"></bean>

CalendarIntervalTrigger没有对应的FactoryBean,直接设置实现类CalendarIntervalTriggerImpl;指定的重复周期是1,默认单位是天,也就是每天执行一次,查看表如下:

mysql> select * from qrtz_simprop_triggers;
+-------------+--------------------+--------------------+------------+---------------+------------+------------+------------+-------------+-------------+------------+------------+-------------+-------------+
| SCHED_NAME  | TRIGGER_NAME       | TRIGGER_GROUP      | STR_PROP_1 | STR_PROP_2    | STR_PROP_3 | INT_PROP_1 | INT_PROP_2 | LONG_PROP_1 | LONG_PROP_2 | DEC_PROP_1 | DEC_PROP_2 | BOOL_PROP_1 | BOOL_PROP_2 |
+-------------+--------------------+--------------------+------------+---------------+------------+------------+------------+-------------+-------------+------------+------------+-------------+-------------+
| myScheduler | calendarTriggerKey | firstCalendarGroup | DAY        | Asia/Shanghai | NULL       |          1 |          1 |           0 |           0 |       NULL |       NULL | 0           | 0           |
+-------------+--------------------+--------------------+------------+---------------+------------+------------+------------+-------------+-------------+------------+------------+-------------+-------------+

提供了3个string类型的参数,2个int类型的参数,2个long类型的参数,2个decimal类型的参数以及2个boolean类型的参数;具体每个参数是什么含义,根据不同的trigger类型存放各自的参数;

5.qrtz_fired_triggers

存储已经触发的trigger相关信息,trigger随着时间的推移状态发生变化,直到最后trigger执行完成,从表中被删除;已SimpleTrigger为例重复3次执行,查询表:

mysql> select * from qrtz_fired_triggers;
+-------------+----------------------------------------+--------------------+------------------+---------------------------+---------------+---------------+----------+-----------+-----------------+-----------+------------------+-------------------+
| SCHED_NAME  | ENTRY_ID                               | TRIGGER_NAME       | TRIGGER_GROUP    | INSTANCE_NAME             | FIRED_TIME    | SCHED_TIME    | PRIORITY | STATE     | JOB_NAME        | JOB_GROUP | IS_NONCONCURRENT | REQUESTS_RECOVERY |
+-------------+----------------------------------------+--------------------+------------------+---------------------------+---------------+---------------+----------+-----------+-----------------+-----------+------------------+-------------------+
| myScheduler | NJD9YZGJ2-PC15241041777351524104177723 | firstSimpleTrigger | firstSimpleGroup | NJD9YZGJ2-PC1524104177735 | 1524104178499 | 1524104178472 |        0 | EXECUTING | firstSimpleTask | DEFAULT   | 0                | 0                 |
| myScheduler | NJD9YZGJ2-PC15241041777351524104177724 | firstSimpleTrigger | firstSimpleGroup | NJD9YZGJ2-PC1524104177735 | 1524104180477 | 1524104180472 |        0 | EXECUTING | firstSimpleTask | DEFAULT   | 0                | 0                 |
| myScheduler | NJD9YZGJ2-PC15241041777351524104177725 | firstSimpleTrigger | firstSimpleGroup | NJD9YZGJ2-PC1524104177735 | 1524104180563 | 1524104182472 |        0 | ACQUIRED  | NULL            | NULL      | 0                | 0                 |
+-------------+----------------------------------------+--------------------+------------------+---------------------------+---------------+---------------+----------+-----------+-----------------+-----------+------------------+-------------------+

相同的trigger和task,每触发一次都会创建一个实例;从刚被创建的ACQUIRED状态,到EXECUTING状态,最后执行完从数据库中删除;

6.qrtz_triggers

存储定义的trigger,以上定义的三个triggers为例,分别是:firstSimpleTrigger,firstCalendarTrigger和firstCronTrigger,运行之后查看数据库:

mysql> select * from qrtz_triggers;
+-------------+--------------------+--------------------+-------------------+-----------+-------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+----------+
| SCHED_NAME  | TRIGGER_NAME       | TRIGGER_GROUP      | JOB_NAME          | JOB_GROUP | DESCRIPTION | NEXT_FIRE_TIME | PREV_FIRE_TIME | PRIORITY | TRIGGER_STATE | TRIGGER_TYPE | START_TIME    | END_TIME | CALENDAR_NAME | MISFIRE_INSTR | JOB_DATA |
+-------------+--------------------+--------------------+-------------------+-----------+-------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+----------+
| myScheduler | calendarTriggerKey | firstCalendarGroup | firstCalendarTask | DEFAULT   | NULL        |  1524203884719 |  1524117484719 |        5 | WAITING       | CAL_INT      | 1524117484719 |        0 | NULL          |             0 |          |
| myScheduler | firstCronTrigger   | firstCronGroup     | firstTask         | DEFAULT   | NULL        |  1524117492000 |  1524117486000 |        0 | ACQUIRED      | CRON         | 1524117483000 |        0 | firstCalendar |             0 |          |
| myScheduler | firstSimpleTrigger | firstSimpleGroup   | firstSimpleTask   | DEFAULT   | NULL        |             -1 |  1524117488436 |        0 | COMPLETE      | SIMPLE       | 1524117484436 |        0 | NULL          |             0 |          |
+-------------+--------------------+--------------------+-------------------+-----------+-------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+----------+

和qrtz_fired_triggers存放的不一样,不管trigger触发了多少次都只有一条记录,TRIGGER_STATE用来标识当前trigger的状态;firstCalendarTask每天执行一次,执行完之后一直是WAITING状态;firstCronTrigger每6秒执行一次状态是ACQUIRED状态;firstSimpleTrigger重复执行6次后状态为COMPLETE,并且会被删除;

7.qrtz_job_details

存储jobDetails信息,相关信息在定义的时候指定,如上面定义的JobDetailFactoryBean,查询数据库:

mysql> select * from qrtz_job_details;
+-------------+-------------------+-----------+-------------+-----------------------------------------+------------+------------------+----------------+-------------------+----------+
| SCHED_NAME  | JOB_NAME          | JOB_GROUP | DESCRIPTION | JOB_CLASS_NAME                          | IS_DURABLE | IS_NONCONCURRENT | IS_UPDATE_DATA | REQUESTS_RECOVERY | JOB_DATA |
+-------------+-------------------+-----------+-------------+-----------------------------------------+------------+------------------+----------------+-------------------+----------+
| myScheduler | firstCalendarTask | DEFAULT   | NULL        | zh.maven.SQuartz.task.CalendarFirstTask | 0          | 0                | 0              | 0                 | |
| myScheduler | firstSimpleTask   | DEFAULT   | NULL        | zh.maven.SQuartz.task.SimpleFirstTask   | 0          | 0                | 0              | 0                 | |
| myScheduler | firstTask         | DEFAULT   | NULL        | zh.maven.SQuartz.task.FirstTask         | 0          | 0                | 0              | 0                 | |
+-------------+-------------------+-----------+-------------+-----------------------------------------+------------+------------------+----------------+-------------------+----------+

JOB_DATA存放的就是定义task时指定的jobDataMap属性,所以此属性需要实现Serializable接口,方便持久化到数据库;

8.qrtz_calendars

Quartz为我们提供了日历的功能,可以自己定义一个时间段,可以控制触发器在这个时间段内触发或者不触发;现在提供6种类型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar;以下使用CronCalendar为例:

<bean id="firstCalendar" class="org.quartz.impl.calendar.CronCalendar"><constructor-arg value="0/5 * * ? * *"></constructor-arg>
</bean>
<bean id="firstCronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="firstTask" /><property name="cronExpression" value="0/6 * * ? * *" /><property name="group" value="firstCronGroup"></property><property name="calendarName" value="firstCalendar"></property>
</bean>
<bean id="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="schedulerName" value="myScheduler"></property><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:quartz.properties" /><property name="triggers"><list><ref bean="firstCronTrigger" /></list></property><property name="calendars"><map><entry key="firstCalendar" value-ref="firstCalendar"></entry></map></property>
</bean>

定义了一个排除每隔5秒的CronCalendar,然后在firstCronTrigger中指定了calendarName,并且需要在SchedulerFactoryBean中定义calendars;因为firstCronTrigger每6秒执行一次,而CronCalendar排除每隔5秒,所以会出现firstCronTrigger在第5次触发的时候需要等待12秒,结果如下:

20180419 15:09:06---start FirstService
20180419 15:09:08---end FirstService
20180419 15:09:12---start FirstService
20180419 15:09:14---end FirstService
20180419 15:09:18---start FirstService
20180419 15:09:20---end FirstService
20180419 15:09:24---start FirstService
20180419 15:09:26---end FirstService
20180419 15:09:36---start FirstService
20180419 15:09:38---end FirstService

查询保存在数据中的CronCalendar:

mysql> select * from qrtz_calendars;
+-------------+---------------+----------+
| SCHED_NAME  | CALENDAR_NAME | CALENDAR |
+-------------+---------------+----------+
| myScheduler | firstCalendar | |
+-------------+---------------+----------+

CALENDAR存放的是CronCalendar序列化之后的数据;

9.qrtz_paused_trigger_grps

存放暂停掉的触发器,测试手动暂停firstCronTrigger,代码如下:

public class App {public static void main(String[] args) {final AbstractApplicationContext context = new ClassPathXmlApplicationContext("quartz.xml");final StdScheduler scheduler = (StdScheduler) context.getBean("scheduler");try {Thread.sleep(4000);scheduler.pauseTriggers(GroupMatcher.triggerGroupEquals("firstCronGroup"));} catch (Exception e) {e.printStackTrace();}}
}

启动之后延迟4秒后暂停firstCronTrigger,这里传递的参数group,然后查看数据库:

mysql> select * from qrtz_paused_trigger_grps;
+-------------+----------------+
| SCHED_NAME  | TRIGGER_GROUP  |
+-------------+----------------+
| myScheduler | firstCronGroup |
+-------------+----------------+

因为已经入库,所以重启之后firstCronGroup还是处于暂停状态,firstCronTrigger不会运行;

10.qrtz_scheduler_state

存储所有节点的scheduler,会定期检查scheduler是否失效,启动多个scheduler,查询数据库:

mysql> select * from qrtz_scheduler_state;
+-------------+---------------------------+-------------------+------------------+
| SCHED_NAME  | INSTANCE_NAME             | LAST_CHECKIN_TIME | CHECKIN_INTERVAL |
+-------------+---------------------------+-------------------+------------------+
| myScheduler | NJD9YZGJ2-PC1524209095408 |     1524209113973 |             1000 |
| myScheduler | NJD9YZGJ2-PC1524209097649 |     1524209113918 |             1000 |
+-------------+---------------------------+-------------------+------------------+

记录了最后最新的检查时间,在quartz.properties中设置了CHECKIN_INTERVAL为1000,也就是每秒检查一次;

11.qrtz_locks

Quartz提供的锁表,为多个节点调度提供分布式锁,实现分布式调度,默认有2个锁:

mysql> select * from qrtz_locks;
+-------------+----------------+
| SCHED_NAME  | LOCK_NAME      |
+-------------+----------------+
| myScheduler | STATE_ACCESS   |
| myScheduler | TRIGGER_ACCESS |
+-------------+----------------+

STATE_ACCESS主要用在scheduler定期检查是否失效的时候,保证只有一个节点去处理已经失效的scheduler;
TRIGGER_ACCESS主要用在TRIGGER被调度的时候,保证只有一个节点去执行调度;

总结

本文对这11张表做了简要的分析,介绍了每张表具体是用来存储什么的,并且给了简单的实例;其实如果要实现一个trigger的管理系统,其实也就是对这几张表的维护。

转载于:https://my.oschina.net/OutOfMemory/blog/1799185


http://chatgpt.dhexx.cn/article/hUr2iVxe.shtml

相关文章

php rsa公钥加密,PHP RSA加密

这两天正好做一个rsa加密,现在就总结一下其中的几个要点。 1.什么是rsa算法 RSA公钥加密算法是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA…

php 代码加密运行,php加密后可以直接运行吗

加密后的php代码需要ZendGuardLoader模块才能正常运行 下载ZendGuardLoader压缩包 下载好后解压压缩包&#xff0c;找到目录下的 ZendLoader.dll 文件&#xff0c;将它放到你的php目录下ext下&#xff0c;再编辑php.ini文件&#xff0c;添加一段代码&#xff1a;[Zend.loader] …

PHP加密 php源代码在线加密工具推荐

在我们开发的项目中&#xff0c;有一部分可能是用于商业用途&#xff0c;会部署在客户提供的机器环境中。因为 PHP 本身是解释型语言&#xff0c;所以未进行处理的代码&#xff0c;就会有泄露或被修改的风险。那么我们可能会想到最简单有效的方法就是进行PHP代码的加密&#xf…

PHP数据加密的几种方式

首先我们来了解一下为什么要加密&#xff1f; 在网络通信的过程中攻击者可以伪造请求和返回&#xff0c;从而达到不可告人的目的。如下图所示&#xff1a; 数据加密之后可以防止他人监听窃取信息以及通讯内容被篡改。 了解了加密的作用&#xff0c;我再来说说加密的方式&…

php代码加密 php-screw-plus

1.下载本程序并解压到某个目录 下载 https://gitee.com/splot/php-screw-plus 2.解压 3.编译 进入目录 /usr/local/php/bin/phpize &#xff08;在screw plus目录中执行php bin中的phpize自动生成扩展所需文件&#xff09; ./configure --with-php-config/usr/local/php…

php代码加密

如何对PHP文件进行加密——ZendGuard加密与ZendLoader解密 end Guard是目前市面上最成熟的PHP源码加密产品。 经过本人搜集资料&#xff0c;亲身测试后&#xff0c;总结了如何利用Zend Guard对PHP文件进行加密&#xff0c;以及如何利用Zend Loader对加密后的PHP文件进行解密。 …

php7 加密扩展,一个PHP7 代码的加密扩展,

一个PHP7 代码的加密扩展是PHP7代码的加密扩展&#xff0c; PHP7栏目介绍如何加密扩展 推荐&#xff1a;PHP7 介绍 一个简洁高效的跨 特点 简单快速&#xff0c;实际测量后几乎不影响性能。它与其他扩展兼容&#xff0c;如OPcache和Xdebug。它支持Linux、macOS、Windows等系统。…

PHP源代码加密后正常运行

因为老板想对做出来的产品进行加密防止进行修改&#xff0c;和源代码的流逝&#xff0c;让我们看看有没有加密的方法。所以通过网上找到了相关的一些教程&#xff0c;还可以&#xff0c;记录一下 在这使用的是 php screw plus github地址 https://github.com/del-xiong/screw-p…

看我如何玩转PHP代码加密与解密

参考文献&#xff1a; https://xz.aliyun.com/t/2403 前言 两次比赛&#xff0c;两个题目&#xff0c;两种方式&#xff0c;两个程序。 一切PHP的代码终究是要到Zend Engine上走一走的&#xff0c;因此一切PHP的源码加密都是可以被解密的。&#xff08;不包括OpCode混淆-VM…

一文打尽PHP代码加密方式

原文地址 温馨提示&#xff1a;世界上没有破不了的密码&#xff0c;如果有那也只是时间问题。 我们能做的只是增加破解时间。如果这个破解时间大于一个人的寿命&#xff0c;那么这个加密方式肯定是成功的。 对于加密的程序&#xff0c;就像破解者需要了解、猜测编写者的思路…

大数据运维工程师面试

当前你们公司使用的Hadoop版本是什么 ambari2.5.1 Hadoop 2.7.3.2.6.2.14-5HDFS常见的数据压缩格式有哪些&#xff0c;介绍其中一种详细的实现方式 1 gzip压缩 优点&#xff1a;压缩率比较高&#xff0c;而且压缩/解压速度也比较快&#xff1b;hadoop本身支持&#xff0c;在…

Linux运维工程师常见基础面试题

1、tcp三次握手四次挥手详解 TCP是一种面向连接的协议&#xff0c;通信前需要建立连接&#xff0c;通信结束后需要释放连接。TCP通过三次握手建立连接&#xff0c;四次挥手释放连接。 三次握手&#xff1a; 1、客户端向服务器发送SYN包&#xff0c;表示请求建立连接。 2、服务…

运维工程师面试总结(含答案)

运维工程师面试总结 原文链接&#xff1a;https://www.cuiliangblog.cn/detail/article/2 一、linux 1. linux系统启动流程 第一步&#xff1a;开机自检&#xff0c;加载BIOS第二步&#xff1a;读取&#xff2d;&#xff22;&#xff32;第三步&#xff1a;Boot Loader grub…

Linux运维工程师面试题(1)

文章目录 Linux运维工程师面试题&#xff08;1&#xff09;1 别名、内部命令、外部命令的执行顺序2 linux 系统启动流程3 破解用户密码的方法4 忘记 grub 密码怎么解决5 硬盘空间满了怎么处理&#xff0c;怎么找到硬盘中的大文件6 硬盘明明有很多空间&#xff0c;为什么无法存储…

Linux运维工程师面试题整理

1.Nginx反向代理&#xff0c;负载均衡&#xff0c;动静分离&#xff0c;工作原理及优化 nginx配置反向代理。 vim Nginx.conf Server模块中配置 Listen 80 Server_name ip; 在server段里面的location加上proxy_pass http://ip:端口; Nginx配置完成后重启一下nginx。 配…

FastReport打印标签

1、选择标签向导 2、在这里可以选择自己想要的标签布局&#xff0c;也可以点击左下角的自定义标签 3、点击自定义标签后&#xff0c;可以自定义自己想要的标签 4、点击确定之后&#xff0c;可以在制造商找到自定义&#xff0c;选择自定义的标签1 5、然后可以在数据区自定义想要…

深度学习训练数据打标签过程

深度学习训练数据打标签过程 为了获取大量的图片训练数据&#xff0c;在采集数据的过程中常用视频的方式采集数据&#xff0c;但对于深度学习&#xff0c;训练的过程需要很多的有有标签的数据&#xff0c;这篇文章主要是解决视频文件转换成图片文件&#xff0c;并加标签&#…

k8s-节点打标签

node标签设置后&#xff0c;pod可以根据要求让pod调度到想要的节点上运行&#xff0c;或者不在某节点运行。或者确保pod调度到具有高性能&#xff08;比如ssd的机器&#xff09;的节点山上。 1.展示节点标签&#xff1a; kubectl get node --show-labelstrue2.添加节点标签 …

python 图片数据集批量打标签

1.数据集介绍 OutdoorScene数据集&#xff1a;http://people.csail.mit.edu/torralba/code/spatialenvelope/ This dataset contains 8 outdoor scene categories: coast, mountain, forest, open country, street, inside city, tall buildings and highways. There are 2688…

打印标签时如何解决打印偏移

我们在打印标签时&#xff0c;使用的纸张一般都是不干胶卷纸&#xff0c;这样的卷纸又有单排、双排、三排和四排的规格。这些不同规格的标签纸在条码打印中经常会出现打印偏移的问题&#xff0c;甚至会跳纸&#xff0c;遇到这样的情况该如何调整呢&#xff1f;小编下面详细介绍…