Q1:
Tree节点点击,内容不能按要求显示(要求是点击根节点能够显示全部数据,点击子节点则只显示子节点下的数据列表)
Answer:问题在于树点击事件后,数据请求方面只拿到了节点Id,查询时候走的按Id查询,这种方式显示的结果只能是根据不同节点显示节点下的内容,
最后在后端对树节点的层级代码进行判断,通过层级代码查询数据。Vue中也在点击树时候传入树信息,请求数据时拿出树的层级代码。
Q2:
关闭dialog弹框,input的失去焦点触发事件未在下次窗口重新打开时消除
Answer:错误点是虽然在关闭按钮点击操作中引入了close方法,并执行了弹窗关闭功能,但是没调用resetFields表单重置函数清空表单数据。表单在创建时就设置了ref属性等于’duty’,在关闭方法中
通过调用$refs.duty.resetFields()成功解决。
什么是定时任务调度?
任务调度,指的是基于给定的时间点、给定时间间隔或给定的执行次数自动之心任务。
先用一个简单的线程问题来说明,可以创建一个线程,把它放在一个while循环中,通过设置sleep方法来达到定时执行任务的效果。
任务调度方式:
Timer、ScheduledExecutor、JCron Tab、开源工具包Quartz
(1)Timer:java.util.Timer是最简单的实现任务调度方式,JDK自带、简洁、单线程,核心类是Timer和TimerTask
Timer的优点在于简单易用,但由于所有的任务都使用一个线程来调度,因此所有的任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或者异常都会影响到下一个
任务的正常执行。
(2)ScheduledExecutor:Java5中推出了基于线程池设计的ScheduledExecutor。其设计思想是每一个任务都会由线程池中的一个线程去执行,因此任务是并发的不会相互干扰,实际上只有在任务达到
执行时间时,线程才会真正启动,其他时间ScheduledExecutor都只是在轮询任务的状态。但无论是Timer还是ScheduledExecutor都只能执行简单的基于开始时间和重复间隔的任务调度,不能
胜任更复杂的调度需求,比如设置每周的周日18:30执行任务。这时候可以借助Calendar间接实现该功能。
使用Calender计算时间,再通过ScheduledExecutor执行任务:
long delay = earliestDateLong - currentDateLong;
//计算执行周期为一星期
long period = 72460*60+1000;
ScheduledExecutorService service =Executors.newScheduledThreadPool(10);
//从现在开始delay毫秒之后,每隔一个星期执行一次job
service.scheduleAtFixedRate(test,delay,period,TimeUtil.MILLISECONDS);
从上述方法中可以看出,想要通过简单的类方法去实现复杂的调度任务是非常麻烦的,需要一个完善的框架来解决复杂调度任务问题。开源工具包Quartz提供了这方面的支持。
(4)Quartz:这是一个开源Java库,相当于Timer、ScheduledExecutor、JCron Tab的合并;
Scheduler:调度容器; Job:接口类;
JobDetail:Job的描述类,job执行是依据此对象的信息反射实例化出Job的具体执行对象;
Trigger:存放Job执行的事件策略;
Calendar:指定排除的时间
## 什么是分布式调度任务?
传统任务调度缺点:
1、没有补偿机制
2、不支持集群
3、不支持路由策略(分发)
4、不支持统计
5、不支持管理平台
6、没有报警邮箱(服务器宕机时要及时给维护人员发送报警邮件)
7、没有状态监控
分布式任务调度存在一个问题,如何保证定时任务不被重复执行(同一个项目被打成war包部署在多个服务器上,这时如果有任务调度就会出现同时一个任务被重复执行的问题)
分布式定时任务解决方案:
(1)使用zookeeper实现分布式锁,保证只有一台服务器执行job,缺点:需要创建临时节点、事件通知不容易扩展;
(2)使用配置文件做一个开关,加一个配置start=true或者start=false,如果为true执行job,如果为false不执行job,缺点:发布后需要重启
(3)数据库唯一约束,每台服务器(例如tomcat)执行job前必须先往数据库中插入一个唯一id,植入成功就执行,其他服务其就不能插入成功,缺点:效率低
(4)使用分布式任务调度平台,XXLJOB
XXLJOB介绍:
XXL-JOB是一个轻量级的分布式任务调度框架,它的目标是学习简单、开发迅速、轻量级、易扩展。
特性:
1、简单易上手,支持通过web页面对任务进行CRUD操作
2、支持动态修改任务状态、启动/停止任务,以及终止运行中的任务,即时生效
3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA
4、执行器HA(分布式):任务分布式执行,任务“执行器”支持集群部署,可保证任务执行HA
5、注册中心:执行器会周期性自动注册任务(@JobHandler),调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址
6、弹性扩容缩容,一旦有新执行器机器上线下线,下次调度时将会重新分配任务
7、路由策略:执行器集群部署时提供丰富的路由策略,包括第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近多久未使用、故障转移、忙碌转移、分片广播
8、故障转移:任务路由策略选择“故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度任务
9、阻塞处理策略:调度过于密集,执行器来不及处理时候的处理策略。包含单机串行、丢弃后续调度、覆盖之前调度
10、任务失败重试
11、任务失败报警,设置报警邮箱,当任务调度失败时向维护人员发送报警邮件(可扩展短信、钉钉等警报方式)
12、任务超时控制,设置超时事件,当任务超时时主动终止任务
13、路由方式选择分片广播策略时,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务
14、实时监控任务进度
15、实时日志
16、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯
17、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、nodejs、PHP、PowerShell等类型脚本
18、支持配置子任务以来,当父任务执行成功后将会主动触发一次子任务的执行,多个子任务用逗号分隔
19、一致性:通过DB锁保证集群分布式调度的一致性,一次任务调度只会触发一次
20、自定义任务参数:支持在线配置调度任务入参,即时生效
21、实时运行报表
22、存在管理员、普通用户两种角色
23、权限控制:管理员拥有全部权限,普通用户需要分配执行器权限后才允许相关操作
等。。。。。。。。。
从源码结构了解xxl-job:
xxl-job-admin:调度中心。负责任务的管理(CRUD),触发、监控、执行器管理等。还有就是提供了Web管理平台,可以方便通过页面管理任务。
xxl-job-core:公共依赖,定义了执行器接口,实现了任务的执行,RPC等
xxl-job-executor-samples:Spring版本,通过Spring容器管理执行器,比较通用
xxl-job-executor-samples-springboot:springboot版本,通过spring boot管理执行器,推荐这种方式
Cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6个或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
(1)Seconds Minutes Hours DayOfMonth Month DayOfWeek Year
(2)Seconds Minutes Hours DayOfMonth Month DayOfWeek
秒 分 时 月份中的日期 月 周中的日期 年
字段 允许值 允许的特殊字符
秒(Seconds) 0~59的整数 , - * / 四个字符
分(Minutes) 0~59的整数 , - * /
小时(Hours) 0~23的整数 , - * /
日期(DayOfMonth) 1~31的整数 , - * ? / L W C 八个字符
月份(Month) 1~12的整数(JAN-Dec) , - * /
星期(DayOfWeek) 1~7的整数(SUN-SAT)1=SUN , - * ? / L C #
年份(Year) 1970~2099 , - * /
特殊字符含义:
(1):表示匹配该域的任意值。加入在Minutes域使用,即表示每分钟都会触发事件
(2)?:只能用在DayOfMonth和DayOfWeek两个域。它也匹配域的任意值,但实际不会。因为DayOfMonth和DayOfWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用
如下写法:0 0 15 20 * ?其中最后一位只能用?而不能使用*,如果使用*不管星期几都会触发,但实际不是这样。
(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分每分钟触发一次
(4)/:表示时期时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次
(5),:表示列出枚举值。例如在Minutes域使用5,20,则意味着在5和20分每分钟触发一次
(6)L:表示最后,只能出现在DayOfWeek和DayOfMonth域。如果在DayOfWeek中使用5L表示在最后一个星期四触发事件
(7)W:表示有效工作日(周1-5),只能出现在DayOfMonth域,系统将在离指定日期的最近有效工作日触发事件。例如:在DayOfMonth使用5W,如果5号是周六,则在最近工作日4号(周五)触发,如果
5号是周日,则在6号(周一)触发。另外一点,W的最近寻找不会跨过月份。
(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个周五
(9)#:用于确定每个月第几个星期几,只能出现在DayOfMonth域。例如4#2,表示在某个月第二个星期三。
常用表达式例子:
(1)0 0 2 1 * ?* :表示在每个月1号2点调度任务
(2)0 0 12 * * ?:表示每天12点执行任务
(3)0 30 10 ?6L 2020-2025:表示2020-2025年每个月最后一个周五的十点半执行
router.js:
在router[ ]中配置多个路由,每个路由使用{ }进行分隔,等个路由中需要设置path、name、 comporntents、meta。
store.js
状态管理有5个核心,分别是state、mutation、getter、action、module
(1) state专门用来存储数据,可以把它想家成组件中的data,
如果在组件中,想要访何store中的数据,只能通过this.$state.xxx来访问;
(2) mutation负责修改state中的数据,也是唯一修改数据的万法;
(3) getter只负责对外提供数据不负责修改数据;
(4) action和mutation有些类似,不同在于action提交是不能直接修改atate中的状态,而mutation是可以直接修改state中的状态:action是支持异步操作的,而mutation只能是同步操作;
(5)module可以分割store成模块,每个模块拥有直接的state、mutation、action、getter。
elementUI:
1、position:absolute的合义:
position属性有四个值:static. fixed、absolute、relative,absolute是绝对定位的意思,即将对象从文档流中拖出,使用left、right、top、bottom等属性进行绝对定位。
Relative是相对定位,依据left、right、top、bottom等属性,在正常文档流中偏移位置。