转自我的个人博客:Springboot集成quartz定时任务可视化配置

使用quartz定时任务已经有一段时间了,今天记录一下Springboot 2.x集成Quartz。

1、引入quartz jar包

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>

2、加入quartz配置

spring:quartz:#相关属性配置properties:org:quartz:scheduler:instanceName: clusteredSchedulerinstanceId: AUTOjobStore:class: org.quartz.impl.jdbcjobstore.JobStoreTXdriverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegatetablePrefix: QRTZ_isClustered: trueclusterCheckinInterval: 10000useProperties: falsethreadPool:class: org.quartz.simpl.SimpleThreadPoolthreadCount: 10threadPriority: 5threadsInheritContextClassLoaderOfInitializingThread: true#数据库方式job-store-type: jdbc#初始化表结构#jdbc:#initialize-schema: never

我这里的jobstore使用的是jdbc jobstore,所有的定时任务都持久化于数据库中。

3、将存储quartz的表导入数据库

DROP TABLE IF EXISTS `qrtz_blob_triggers`;
CREATE TABLE `qrtz_blob_triggers` (`SCHED_NAME` varchar(120) NOT NULL,`TRIGGER_NAME` varchar(190) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,`BLOB_DATA` blob,PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_calendars`;
CREATE TABLE `qrtz_calendars` (`SCHED_NAME` varchar(120) NOT NULL,`CALENDAR_NAME` varchar(190) NOT NULL,`CALENDAR` blob NOT NULL,PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_cron_triggers`;
CREATE TABLE `qrtz_cron_triggers` (`SCHED_NAME` varchar(120) NOT NULL,`TRIGGER_NAME` varchar(190) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,`CRON_EXPRESSION` varchar(120) NOT NULL,`TIME_ZONE_ID` varchar(80) DEFAULT NULL,PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_fired_triggers`;
CREATE TABLE `qrtz_fired_triggers` (`SCHED_NAME` varchar(120) NOT NULL,`ENTRY_ID` varchar(95) NOT NULL,`TRIGGER_NAME` varchar(190) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,`INSTANCE_NAME` varchar(190) NOT NULL,`FIRED_TIME` bigint(13) NOT NULL,`SCHED_TIME` bigint(13) NOT NULL,`PRIORITY` int(11) NOT NULL,`STATE` varchar(16) NOT NULL,`JOB_NAME` varchar(190) DEFAULT NULL,`JOB_GROUP` varchar(190) DEFAULT NULL,`IS_NONCONCURRENT` varchar(1) DEFAULT NULL,`REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_job_details`;
CREATE TABLE `qrtz_job_details` (`SCHED_NAME` varchar(120) NOT NULL,`JOB_NAME` varchar(190) NOT NULL,`JOB_GROUP` varchar(190) NOT NULL,`DESCRIPTION` varchar(250) DEFAULT NULL,`JOB_CLASS_NAME` varchar(250) NOT NULL,`IS_DURABLE` varchar(1) NOT NULL,`IS_NONCONCURRENT` varchar(1) NOT NULL,`IS_UPDATE_DATA` varchar(1) NOT NULL,`REQUESTS_RECOVERY` varchar(1) NOT NULL,`JOB_DATA` blob,PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_locks`;
CREATE TABLE `qrtz_locks` (`SCHED_NAME` varchar(120) NOT NULL,`LOCK_NAME` varchar(40) NOT NULL,PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;
CREATE TABLE `qrtz_paused_trigger_grps` (`SCHED_NAME` varchar(120) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_scheduler_state`;
CREATE TABLE `qrtz_scheduler_state` (`SCHED_NAME` varchar(120) NOT NULL,`INSTANCE_NAME` varchar(190) NOT NULL,`LAST_CHECKIN_TIME` bigint(13) NOT NULL,`CHECKIN_INTERVAL` bigint(13) NOT NULL,PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_simple_triggers`;
CREATE TABLE `qrtz_simple_triggers` (`SCHED_NAME` varchar(120) NOT NULL,`TRIGGER_NAME` varchar(190) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,`REPEAT_COUNT` bigint(7) NOT NULL,`REPEAT_INTERVAL` bigint(12) NOT NULL,`TIMES_TRIGGERED` bigint(10) NOT NULL,PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_simprop_triggers`;
CREATE TABLE `qrtz_simprop_triggers` (`SCHED_NAME` varchar(120) NOT NULL,`TRIGGER_NAME` varchar(190) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,`STR_PROP_1` varchar(512) DEFAULT NULL,`STR_PROP_2` varchar(512) DEFAULT NULL,`STR_PROP_3` varchar(512) DEFAULT NULL,`INT_PROP_1` int(11) DEFAULT NULL,`INT_PROP_2` int(11) DEFAULT NULL,`LONG_PROP_1` bigint(20) DEFAULT NULL,`LONG_PROP_2` bigint(20) DEFAULT NULL,`DEC_PROP_1` decimal(13,4) DEFAULT NULL,`DEC_PROP_2` decimal(13,4) DEFAULT NULL,`BOOL_PROP_1` varchar(1) DEFAULT NULL,`BOOL_PROP_2` varchar(1) DEFAULT NULL,PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `qrtz_triggers`;
CREATE TABLE `qrtz_triggers` (`SCHED_NAME` varchar(120) NOT NULL,`TRIGGER_NAME` varchar(190) NOT NULL,`TRIGGER_GROUP` varchar(190) NOT NULL,`JOB_NAME` varchar(190) NOT NULL,`JOB_GROUP` varchar(190) NOT NULL,`DESCRIPTION` varchar(250) DEFAULT NULL,`NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,`PREV_FIRE_TIME` bigint(13) DEFAULT NULL,`PRIORITY` int(11) DEFAULT NULL,`TRIGGER_STATE` varchar(16) NOT NULL,`TRIGGER_TYPE` varchar(8) NOT NULL,`START_TIME` bigint(13) NOT NULL,`END_TIME` bigint(13) DEFAULT NULL,`CALENDAR_NAME` varchar(190) DEFAULT NULL,`MISFIRE_INSTR` smallint(2) DEFAULT NULL,`JOB_DATA` blob,PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ps:上面的表结构是我从数据库导出的,由于外键影响可能建表顺序需要调整。

4、springboot启动类上加上@EnableScheduling注解,就这样springboot已经自动帮我们生成好了任务调度器。

5、封装QuartzJobService

QuartzJobService接口

public interface QuartzJobService {/*** 创建job** @param jobDto          任务类*/void addJob(JobDto jobDto)throws Exception;/*** 创建job,可传参** @param jobDto          任务类* @param argMap         map形式参数*/void addJob(JobDto jobDto, Map<String, Object> argMap)throws Exception;/*** 暂停job** @param jobName      任务名称* @param jobGroupName 任务所在组名称*/void pauseJob(String jobName, String jobGroupName)throws Exception;/*** 恢复job** @param jobName      任务名称* @param jobGroupName 任务所在组名称*/void resumeJob(String jobName, String jobGroupName)throws Exception;/*** job 更新,只更新频率**/void updateJob(JobDto jobDto)throws Exception;/*** job 更新,更新频率和参数** @param argMap         参数*/void updateJob(JobDto jobDto, Map<String, Object> argMap)throws Exception;/*** job 更新,只更新更新参数** @param jobName      任务名称* @param jobGroupName 任务所在组名称* @param argMap       参数*/void updateJob(String jobName, String jobGroupName, Map<String, Object> argMap)throws Exception;/*** job 删除** @param jobName      任务名称* @param jobGroupName 任务所在组名称*/void deleteJob(String jobName, String jobGroupName)throws Exception;/*** 启动所有定时任务*/void startAllJobs()throws Exception;/*** 关闭所有定时任务*/void shutdownAllJobs()throws Exception;/*** 获取所有任务列表** @return*/List<JobDto> getAllJob()throws Exception;/*** 通过jobname查询job* @param jobName* @return job的状态*/Trigger.TriggerState getJobByName(String jobName)throws Exception;}

QuartzJobService实现类

@Service
public class QuartzJobServiceImpl implements QuartzJobService {private  Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate Scheduler scheduler;/*** 创建job**/public void addJob(JobDto jobDto)throws Exception {addJob(jobDto, null);}/*** 创建job,可传参** @param jobDto          任务类* @param argMap         map形式参数*/public void addJob(JobDto jobDto, Map<String, Object> argMap)throws Exception {Class<?> clazz = jobDto.getClazz();String jobName = jobDto.getJobName();String groupName = jobDto.getGroupName();String cronExpression = jobDto.getCronExpression();// 启动调度器scheduler.start();//构建job信息JobDetail jobDetail = JobBuilder.newJob(((Job) clazz.newInstance()).getClass()).withIdentity(jobName, groupName).withDescription(jobDto.getDesc()).build();//表达式调度构建器(即任务执行的时间)CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);//按新的cronExpression表达式构建一个新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(scheduleBuilder).build();//获得JobDataMap,写入数据if (argMap != null) {trigger.getJobDataMap().putAll(argMap);}if (!StringUtils.isBlank(jobDto.getTime())){trigger.getJobDataMap().put("time", jobDto.getTime());}scheduler.scheduleJob(jobDetail, trigger);}/*** 暂停job** @param jobName      任务名称* @param jobGroupName 任务所在组名称*/public void pauseJob(String jobName, String jobGroupName)throws Exception {scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));}/*** 恢复job** @param jobName      任务名称* @param jobGroupName 任务所在组名称*/public void resumeJob(String jobName, String jobGroupName)throws Exception {scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));}/*** job 更新,只更新频率**/public void updateJob(JobDto jobDto)throws Exception {updateJob(jobDto, null);}/*** job 更新,更新频率和参数* @param argMap         参数*/public void updateJob(JobDto jobDto, Map<String, Object> argMap)throws Exception {TriggerKey triggerKey = TriggerKey.triggerKey(jobDto.getJobName(), jobDto.getGroupName());// 表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(jobDto.getCronExpression());CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);// 按新的cronExpression表达式重新构建triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();//修改mapif (argMap != null) {trigger.getJobDataMap().putAll(argMap);}trigger.getJobDataMap().put("time", jobDto.getTime());// 按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);}/*** job 更新,只更新更新参数** @param jobName      任务名称* @param jobGroupName 任务所在组名称* @param argMap       参数*/public void updateJob(String jobName, String jobGroupName, Map<String, Object> argMap)throws Exception {TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);//修改maptrigger.getJobDataMap().putAll(argMap);// 按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);}/*** job 删除** @param jobName      任务名称* @param jobGroupName 任务所在组名称*/public void deleteJob(String jobName, String jobGroupName)throws Exception {scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));}/*** 启动所有定时任务*/public void startAllJobs()throws Exception {scheduler.start();}/*** 关闭所有定时任务*/public void shutdownAllJobs()throws Exception {if (!scheduler.isShutdown()) {scheduler.shutdown();}}/*** 获取所有任务列表** @return*/public List<JobDto> getAllJob()throws Exception {GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();List<JobDto> jobList = new ArrayList<>();Set<JobKey> jobKeys = null;jobKeys = scheduler.getJobKeys(matcher);for (JobKey jobKey : jobKeys) {List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);for (Trigger trigger : triggers) {JobDto jobDto = new JobDto();jobDto.setJobName(jobKey.getName());jobDto.setGroupName(jobKey.getGroup());JobDetail jobDetail = scheduler.getJobDetail(jobKey);jobDto.setClassName(jobDetail.getJobClass().getName());jobDto.setClazz(jobDetail.getJobClass());jobDto.setTriggerName(trigger.getCalendarName());jobDto.setDesc(jobDetail.getDescription());jobDto.setTime(trigger.getJobDataMap().getString("time"));Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());jobDto.setStatus(triggerState.name());if (trigger instanceof CronTrigger) {CronTrigger cronTrigger = (CronTrigger) trigger;String cronExpression = cronTrigger.getCronExpression();jobDto.setCronExpression(cronExpression);}jobList.add(jobDto);}}return jobList;}/*** 通过jobname查询job* @param jobName* @return job的状态*/public Trigger.TriggerState getJobByName(String jobName)throws Exception {GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();Set<JobKey> jobKeys = null;jobKeys = scheduler.getJobKeys(matcher);for (JobKey jobKey : jobKeys) {List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);for (Trigger trigger : triggers) {Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());if (jobKey.getName().equals(jobName)){return triggerState;}}}return null;}}

至此,springboot已经集成好了quartz,通过我们封装的QuartzJobService,很容易就实现可视化的定时任务增删改查操作。

Springboot集成quartz定时任务可视化配置​​​​​​​相关推荐

  1. Springboot集成Quartz定时任务yml文件配置方式

    构建maven项目,引入maven依赖包 其中quartz.quartz-jobs.spring-boot-starter-quartz.spring-context-support  四个依赖包为q ...

  2. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  3. SpringBoot集成Quartz(定时任务)

    SpringBoot集成Quartz(定时任务)_鱼找水需要时间的博客-CSDN博客_springboot集成quartz

  4. SpringBoot集成quartz定时调度任务并通过JDBC持久化

    SpringBoot集成quartz定时调度任务并通过JDBC持久化 话不多说上干货 项目pom依赖 配置类 抽象出调度任务实体类 调度执行和调度任务更改工具类 调度配置与执行的代码完毕,下面就是对持 ...

  5. SpringBoot集成Quartz框架

    SpringBoot集成Quartz框架 (一)集成环境: ​ Win10系统 ​ JDK版本:11.0.13 ​ SpringBoot版本:2.3.4.RELEASE ​ Quartz版本:2.3. ...

  6. SpringBoot - 集成Quartz框架:Couldn‘t acquire next trigger: Couldn‘t retrieve trigger: 不良的类型值 long : \x

    写在前面 SpringBoot 集成Quartz框架时,数据保存方式使用PostgreSQL进行数据库持久化. 报错如下: Couldn't acquire next trigger: Couldn' ...

  7. SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null)

    SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null) 参考文章: (1)SpringBoot集成Quartz(解决@Autowired空指针Nu ...

  8. 定时任务:springboot集成Quartz实现多任务多触发的动态管理

    本文主要讲解以下几个方面: 1.定时任务的定义及其常见的模式 2.springboot集成quart实例 3.中途会遇到的一些问题 一.定时任务的定义及其常见的模式 1)定时任务的定义 首先要明白的是 ...

  9. SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

最新文章

  1. 硬中断与软中断的区别!!!
  2. python爬虫系列:12306票务信息爬虫
  3. 浅谈line-height
  4. multipartfile获取数据_详解SpringMVC使用MultipartFile实现文件的上传
  5. 一键重启tomcat
  6. 软件工程学习笔记(三)~顺序图模型
  7. 装修服务转战线上,VR全景为您解决装修行业痛点!
  8. 突然的:图形设备驱动程序错误代码 43 -(已解决)
  9. SAP物料主数据视图维护状态及标识关系表
  10. 【渝粤教育】广东开放大学 土木工程测量 形成性考核 (45)
  11. android百度人脸采集免费,Android 调用百度人脸采集
  12. 用批处理命令批量ping一个网段的IP
  13. SEO不应该忽视的9个谷歌排名因素
  14. Vue错误03:Property or method “xxx“ is not defined on the instance but referenced during render.
  15. 医学杂识-脑电数据-TRC文件解读分析
  16. 如何使用新版本的万能地图下载器下载谷歌电子地图
  17. CANopen原理--NMT状态机
  18. DAY4-仿真 Rviz URDF集成Rviz基本流程和URDF语法
  19. 【原创】flex控制flash元件
  20. android换手机怎么同步,换了新手机,怎么可以快速将旧手机上的信息迁移到新手机上?...

热门文章

  1. 苹果项目关闭服务器,iphone系统服务哪些可以关闭
  2. Spring三级缓存解决循环依赖问题详解
  3. 【Java】炸弹人小游戏
  4. word恢复未保存的文件
  5. 真的了解 Handler 源码吗
  6. LeetCode题解:井字游戏
  7. 联想拯救者R7000+加装SSD+原D盘信息复制分区到新SSD
  8. [应用模板]HTML5淘宝
  9. Hello! 大家好!我叫郑彬,说实话,我只是知道用点office,不太会计算机的,请大家多多指教噢!
  10. 【macOS游戏】Gear.Club Stradale赛车游戏