Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
T
topology
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
姜立玮
topology
Commits
2cc14e5f
提交
2cc14e5f
authored
5 年前
作者:
RuoYi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
若依 2.2
上级
505ee1d6
变更
42
显示空白字符变更
内嵌
并排
正在显示
42 个修改的文件
包含
3325 行增加
和
25 行删除
+3325
-25
package.json
ruoyi-ui/package.json
+1
-1
job.js
ruoyi-ui/src/api/monitor/job.js
+80
-0
jobLog.js
ruoyi-ui/src/api/monitor/jobLog.js
+35
-0
index.vue
ruoyi-ui/src/components/SvgIcon/index.vue
+1
-1
index.vue
ruoyi-ui/src/layout/components/TagsView/index.vue
+1
-1
index.js
ruoyi-ui/src/router/index.js
+13
-0
tagsView.js
ruoyi-ui/src/store/modules/tagsView.js
+6
-13
index.vue
ruoyi-ui/src/views/monitor/job/index.vue
+485
-2
log.vue
ruoyi-ui/src/views/monitor/job/log.vue
+295
-0
pom.xml
ruoyi/pom.xml
+14
-1
quartz.sql
ruoyi/sql/quartz.sql
+170
-0
RuoYiApplication.java
ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java
+1
-1
ScheduleConstants.java
...ain/java/com/ruoyi/common/constant/ScheduleConstants.java
+50
-0
TaskException.java
...in/java/com/ruoyi/common/exception/job/TaskException.java
+34
-0
ExceptionUtil.java
...i/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java
+40
-0
BeanUtils.java
.../src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java
+110
-0
HttpHelper.java
...src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
+0
-1
AbstractQuartzJob.java
...in/java/com/ruoyi/common/utils/job/AbstractQuartzJob.java
+107
-0
CronUtils.java
...i/src/main/java/com/ruoyi/common/utils/job/CronUtils.java
+63
-0
JobInvokeUtil.java
...c/main/java/com/ruoyi/common/utils/job/JobInvokeUtil.java
+182
-0
QuartzDisallowConcurrentExecution.java
...i/common/utils/job/QuartzDisallowConcurrentExecution.java
+21
-0
QuartzJobExecution.java
...n/java/com/ruoyi/common/utils/job/QuartzJobExecution.java
+19
-0
ScheduleUtils.java
...c/main/java/com/ruoyi/common/utils/job/ScheduleUtils.java
+113
-0
ScheduleConfig.java
.../main/java/com/ruoyi/framework/config/ScheduleConfig.java
+57
-0
SecurityConfig.java
.../main/java/com/ruoyi/framework/config/SecurityConfig.java
+1
-0
SameUrlDataInterceptor.java
...yi/framework/interceptor/impl/SameUrlDataInterceptor.java
+1
-1
RyTask.java
ruoyi/src/main/java/com/ruoyi/framework/task/RyTask.java
+28
-0
Server.java
.../src/main/java/com/ruoyi/framework/web/domain/Server.java
+0
-1
CommonController.java
.../main/java/com/ruoyi/project/common/CommonController.java
+20
-0
SysJobController.java
...om/ruoyi/project/monitor/controller/SysJobController.java
+130
-0
SysJobLogController.java
...ruoyi/project/monitor/controller/SysJobLogController.java
+87
-0
SysJob.java
...rc/main/java/com/ruoyi/project/monitor/domain/SysJob.java
+170
-0
SysJobLog.java
...main/java/com/ruoyi/project/monitor/domain/SysJobLog.java
+155
-0
SysJobLogMapper.java
...ava/com/ruoyi/project/monitor/mapper/SysJobLogMapper.java
+64
-0
SysJobMapper.java
...n/java/com/ruoyi/project/monitor/mapper/SysJobMapper.java
+67
-0
ISysJobLogService.java
.../com/ruoyi/project/monitor/service/ISysJobLogService.java
+56
-0
ISysJobService.java
...ava/com/ruoyi/project/monitor/service/ISysJobService.java
+102
-0
SysJobLogServiceImpl.java
...yi/project/monitor/service/impl/SysJobLogServiceImpl.java
+87
-0
SysJobServiceImpl.java
...ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
+254
-0
application.yml
ruoyi/src/main/resources/application.yml
+1
-2
SysJobLogMapper.xml
ruoyi/src/main/resources/mybatis/system/SysJobLogMapper.xml
+93
-0
SysJobMapper.xml
ruoyi/src/main/resources/mybatis/system/SysJobMapper.xml
+111
-0
没有找到文件。
ruoyi-ui/package.json
浏览文件 @
2cc14e5f
{
{
"name"
:
"ruoyi"
,
"name"
:
"ruoyi"
,
"version"
:
"2.
1
.0"
,
"version"
:
"2.
2
.0"
,
"description"
:
"若依管理系统"
,
"description"
:
"若依管理系统"
,
"author"
:
"若依"
,
"author"
:
"若依"
,
"license"
:
"MIT"
,
"license"
:
"MIT"
,
...
...
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/api/monitor/job.js
0 → 100644
浏览文件 @
2cc14e5f
import
request
from
'@/utils/request'
// 查询定时任务调度列表
export
function
listJob
(
query
)
{
return
request
({
url
:
'/monitor/job/list'
,
method
:
'get'
,
params
:
query
})
}
// 查询定时任务调度详细
export
function
getJob
(
jobId
)
{
return
request
({
url
:
'/monitor/job/'
+
jobId
,
method
:
'get'
})
}
// 新增定时任务调度
export
function
addJob
(
data
)
{
return
request
({
url
:
'/monitor/job'
,
method
:
'post'
,
data
:
data
})
}
// 修改定时任务调度
export
function
updateJob
(
data
)
{
return
request
({
url
:
'/monitor/job'
,
method
:
'put'
,
data
:
data
})
}
// 删除定时任务调度
export
function
delJob
(
jobId
)
{
return
request
({
url
:
'/monitor/job/'
+
jobId
,
method
:
'delete'
})
}
// 导出定时任务调度
export
function
exportJob
(
query
)
{
return
request
({
url
:
'/monitor/job/export'
,
method
:
'get'
,
params
:
query
})
}
// 任务状态修改
export
function
changeJobStatus
(
jobId
,
status
)
{
const
data
=
{
jobId
,
status
}
return
request
({
url
:
'/monitor/job/changeStatus'
,
method
:
'put'
,
data
:
data
})
}
// 定时任务立即执行一次
export
function
runJob
(
jobId
,
jobGroup
)
{
const
data
=
{
jobId
,
jobGroup
}
return
request
({
url
:
'/monitor/job/run'
,
method
:
'put'
,
data
:
data
})
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/api/monitor/jobLog.js
0 → 100644
浏览文件 @
2cc14e5f
import
request
from
'@/utils/request'
// 查询调度日志列表
export
function
listJobLog
(
query
)
{
return
request
({
url
:
'/monitor/jobLog/list'
,
method
:
'get'
,
params
:
query
})
}
// 删除调度日志
export
function
delJobLog
(
jobLogId
)
{
return
request
({
url
:
'/monitor/jobLog/'
+
jobLogId
,
method
:
'delete'
})
}
// 清空调度日志
export
function
cleanJobLog
()
{
return
request
({
url
:
'/monitor/jobLog/clean'
,
method
:
'delete'
})
}
// 导出调度日志
export
function
exportJobLog
(
query
)
{
return
request
({
url
:
'/monitor/jobLog/export'
,
method
:
'get'
,
params
:
query
})
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/components/SvgIcon/index.vue
浏览文件 @
2cc14e5f
<
template
>
<
template
>
<div
v-if=
"isExternal"
:style=
"styleExternalIcon"
class=
"svg-external-icon svg-icon"
v-on=
"$listeners"
/>
<div
v-if=
"isExternal"
:style=
"styleExternalIcon"
class=
"svg-external-icon svg-icon"
v-on=
"$listeners"
/>
<svg
v-else
:class=
"svgClass"
aria-hidden=
"true"
v-on=
"$listeners"
>
<svg
v-else
:class=
"svgClass"
aria-hidden=
"true"
v-on=
"$listeners"
>
<use
:
xlink:
href=
"iconName"
/>
<use
:href=
"iconName"
/>
</svg>
</svg>
</
template
>
</
template
>
...
...
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/layout/components/TagsView/index.vue
浏览文件 @
2cc14e5f
...
@@ -158,7 +158,7 @@ export default {
...
@@ -158,7 +158,7 @@ export default {
toLastView
(
visitedViews
,
view
)
{
toLastView
(
visitedViews
,
view
)
{
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
if
(
latestView
)
{
if
(
latestView
)
{
this
.
$router
.
push
(
latestView
)
this
.
$router
.
push
(
latestView
.
fullPath
)
}
else
{
}
else
{
// now the default is to redirect to the home page if there is no tags-view,
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
// you can adjust it according to your needs.
...
...
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/router/index.js
浏览文件 @
2cc14e5f
...
@@ -92,6 +92,19 @@ export const constantRoutes = [
...
@@ -92,6 +92,19 @@ export const constantRoutes = [
}
}
]
]
},
},
{
path
:
'/job'
,
component
:
Layout
,
hidden
:
true
,
children
:
[
{
path
:
'log'
,
component
:
()
=>
import
(
'@/views/monitor/job/log'
),
name
:
'JobLog'
,
meta
:
{
title
:
'调度日志'
}
}
]
},
{
{
path
:
'/gen'
,
path
:
'/gen'
,
component
:
Layout
,
component
:
Layout
,
...
...
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/store/modules/tagsView.js
浏览文件 @
2cc14e5f
...
@@ -28,13 +28,8 @@ const mutations = {
...
@@ -28,13 +28,8 @@ const mutations = {
}
}
},
},
DEL_CACHED_VIEW
:
(
state
,
view
)
=>
{
DEL_CACHED_VIEW
:
(
state
,
view
)
=>
{
for
(
const
i
of
state
.
cachedViews
)
{
const
index
=
state
.
cachedViews
.
indexOf
(
view
.
name
)
if
(
i
===
view
.
name
)
{
index
>
-
1
&&
state
.
cachedViews
.
splice
(
index
,
1
)
const
index
=
state
.
cachedViews
.
indexOf
(
i
)
state
.
cachedViews
.
splice
(
index
,
1
)
break
}
}
},
},
DEL_OTHERS_VISITED_VIEWS
:
(
state
,
view
)
=>
{
DEL_OTHERS_VISITED_VIEWS
:
(
state
,
view
)
=>
{
...
@@ -43,12 +38,10 @@ const mutations = {
...
@@ -43,12 +38,10 @@ const mutations = {
})
})
},
},
DEL_OTHERS_CACHED_VIEWS
:
(
state
,
view
)
=>
{
DEL_OTHERS_CACHED_VIEWS
:
(
state
,
view
)
=>
{
for
(
const
i
of
state
.
cachedViews
)
{
if
(
index
>
-
1
)
{
if
(
i
===
view
.
name
)
{
const
index
=
state
.
cachedViews
.
indexOf
(
i
)
state
.
cachedViews
=
state
.
cachedViews
.
slice
(
index
,
index
+
1
)
state
.
cachedViews
=
state
.
cachedViews
.
slice
(
index
,
index
+
1
)
break
}
else
{
}
state
.
cachedViews
=
[]
}
}
},
},
...
...
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/views/monitor/job/index.vue
浏览文件 @
2cc14e5f
<
template
>
<
template
>
<div
class=
"app-container"
>
<div
class=
"app-container"
>
定时任务
<el-form
:model=
"queryParams"
ref=
"queryForm"
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"任务名称"
prop=
"jobName"
>
<el-input
v-model=
"queryParams.jobName"
placeholder=
"请输入任务名称"
clearable
size=
"small"
@
keyup
.
enter
.
native=
"handleQuery"
/>
</el-form-item>
<el-form-item
label=
"任务组名"
prop=
"jobGroup"
>
<el-select
v-model=
"queryParams.jobGroup"
placeholder=
"请选择任务组名"
clearable
size=
"small"
>
<el-option
v-for=
"dict in jobGroupOptions"
:key=
"dict.dictValue"
:label=
"dict.dictLabel"
:value=
"dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"任务状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"请选择任务状态"
clearable
size=
"small"
>
<el-option
v-for=
"dict in statusOptions"
:key=
"dict.dictValue"
:label=
"dict.dictLabel"
:value=
"dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type=
"primary"
icon=
"el-icon-search"
size=
"mini"
@
click=
"handleQuery"
>
搜索
</el-button>
<el-button
icon=
"el-icon-refresh"
size=
"mini"
@
click=
"resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<el-row
:gutter=
"10"
class=
"mb8"
>
<el-col
:span=
"1.5"
>
<el-button
type=
"primary"
icon=
"el-icon-plus"
size=
"mini"
@
click=
"handleAdd"
v-hasPermi=
"['monitor:job:add']"
>
新增
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"success"
icon=
"el-icon-edit"
size=
"mini"
:disabled=
"single"
@
click=
"handleUpdate"
v-hasPermi=
"['monitor:job:edit']"
>
修改
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"danger"
icon=
"el-icon-delete"
size=
"mini"
:disabled=
"multiple"
@
click=
"handleDelete"
v-hasPermi=
"['monitor:job:remove']"
>
删除
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"warning"
icon=
"el-icon-download"
size=
"mini"
@
click=
"handleExport"
v-hasPermi=
"['monitor:job:export']"
>
导出
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"info"
icon=
"el-icon-s-operation"
size=
"mini"
@
click=
"handleJobLog"
v-hasPermi=
"['monitor:job:query']"
>
日志
</el-button>
</el-col>
</el-row>
<el-table
v-loading=
"loading"
:data=
"jobList"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
<el-table-column
label=
"任务编号"
align=
"center"
prop=
"jobId"
/>
<el-table-column
label=
"任务名称"
align=
"center"
prop=
"jobName"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"任务组名"
align=
"center"
prop=
"jobGroup"
:formatter=
"jobGroupFormat"
/>
<el-table-column
label=
"调用目标字符串"
align=
"center"
prop=
"invokeTarget"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"cron执行表达式"
align=
"center"
prop=
"cronExpression"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"状态"
align=
"center"
>
<template
slot-scope=
"scope"
>
<el-switch
v-model=
"scope.row.status"
active-value=
"0"
inactive-value=
"1"
@
change=
"handleStatusChange(scope.row)"
></el-switch>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
align=
"center"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
<el-button
size=
"mini"
type=
"text"
icon=
"el-icon-caret-right"
@
click=
"handleRun(scope.row)"
v-hasPermi=
"['monitor:job:edit']"
>
执行一次
</el-button>
<el-button
size=
"mini"
type=
"text"
icon=
"el-icon-view"
@
click=
"handleView(scope.row)"
v-hasPermi=
"['monitor:job:query']"
>
详细
</el-button>
</
template
>
</el-table-column>
</el-table>
<pagination
v-show=
"total>0"
:total=
"total"
:page
.
sync=
"queryParams.pageNum"
:limit
.
sync=
"queryParams.pageSize"
@
pagination=
"getList"
/>
<!-- 添加或修改定时任务对话框 -->
<el-dialog
:title=
"title"
:visible
.
sync=
"open"
width=
"700px"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"100px"
>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"任务名称"
prop=
"jobName"
>
<el-input
v-model=
"form.jobName"
placeholder=
"请输入任务名称"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"任务分组"
prop=
"jobGroup"
>
<el-select
v-model=
"form.jobGroup"
placeholder=
"请选择"
>
<el-option
v-for=
"dict in jobGroupOptions"
:key=
"dict.dictValue"
:label=
"dict.dictLabel"
:value=
"dict.dictValue"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
prop=
"invokeTarget"
>
<span
slot=
"label"
>
调用方法
<el-tooltip
placement=
"top"
>
<div
slot=
"content"
>
Bean调用示例:ryTask.ryParams('ry')
<br
/>
Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')
<br
/>
参数说明:支持字符串,布尔类型,长整型,浮点型,整型
</div>
<i
class=
"el-icon-question"
></i>
</el-tooltip>
</span>
<el-input
v-model=
"form.invokeTarget"
placeholder=
"请输入调用目标字符串"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"cron表达式"
prop=
"cronExpression"
>
<el-input
v-model=
"form.cronExpression"
placeholder=
"请输入cron执行表达式"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"是否并发"
prop=
"concurrent"
>
<el-radio-group
v-model=
"form.concurrent"
size=
"small"
>
<el-radio-button
label=
"0"
>
允许
</el-radio-button>
<el-radio-button
label=
"1"
>
禁止
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"错误策略"
prop=
"misfirePolicy"
>
<el-radio-group
v-model=
"form.misfirePolicy"
size=
"small"
>
<el-radio-button
label=
"1"
>
立即执行
</el-radio-button>
<el-radio-button
label=
"2"
>
执行一次
</el-radio-button>
<el-radio-button
label=
"3"
>
放弃执行
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"状态"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
v-for=
"dict in statusOptions"
:key=
"dict.dictValue"
:label=
"dict.dictValue"
>
{{dict.dictLabel}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
</div>
</el-dialog>
<!-- 任务日志详细 -->
<el-dialog
title=
"任务详细"
:visible
.
sync=
"openView"
width=
"700px"
>
<el-form
ref=
"form"
:model=
"form"
label-width=
"120px"
size=
"mini"
>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"任务编号:"
>
{{ form.jobId }}
</el-form-item>
<el-form-item
label=
"任务名称:"
>
{{ form.jobName }}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"任务分组:"
>
{{ jobGroupFormat(form) }}
</el-form-item>
<el-form-item
label=
"创建时间:"
>
{{ form.createTime }}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"cron表达式:"
>
{{ form.cronExpression }}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"下次执行时间:"
>
{{ parseTime(form.nextValidTime) }}
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"调用目标方法:"
>
{{ form.invokeTarget }}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"任务状态:"
>
<div
v-if=
"form.status == 0"
>
正常
</div>
<div
v-else-if=
"form.status == 1"
>
失败
</div>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"是否并发:"
>
<div
v-if=
"form.status == 0"
>
允许
</div>
<div
v-else-if=
"form.status == 1"
>
禁止
</div>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"执行策略:"
>
<div
v-if=
"form.misfirePolicy == 0"
>
默认策略
</div>
<div
v-else-if=
"form.misfirePolicy == 1"
>
立即执行
</div>
<div
v-else-if=
"form.misfirePolicy == 2"
>
执行一次
</div>
<div
v-else-if=
"form.misfirePolicy == 3"
>
放弃执行
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"openView = false"
>
关 闭
</el-button>
</div>
</el-dialog>
</div>
</div>
</template>
</template>
<
script
>
import
{
listJob
,
getJob
,
delJob
,
addJob
,
updateJob
,
exportJob
,
runJob
,
changeJobStatus
}
from
"@/api/monitor/job"
;
export
default
{
name
:
"Job"
,
data
()
{
return
{
// 遮罩层
loading
:
true
,
// 选中数组
ids
:
[],
// 非单个禁用
single
:
true
,
// 非多个禁用
multiple
:
true
,
// 总条数
total
:
0
,
// 定时任务表格数据
jobList
:
[],
// 弹出层标题
title
:
""
,
// 是否显示弹出层
open
:
false
,
// 是否显示详细弹出层
openView
:
false
,
// 任务组名字典
jobGroupOptions
:
[],
// 状态字典
statusOptions
:
[],
// 查询参数
queryParams
:
{
pageNum
:
1
,
pageSize
:
10
,
jobName
:
undefined
,
jobGroup
:
undefined
,
status
:
undefined
},
// 表单参数
form
:
{},
// 表单校验
rules
:
{
jobName
:
[
{
required
:
true
,
message
:
"任务名称不能为空"
,
trigger
:
"blur"
}
],
invokeTarget
:
[
{
required
:
true
,
message
:
"调用目标字符串不能为空"
,
trigger
:
"blur"
}
],
cronExpression
:
[
{
required
:
true
,
message
:
"cron执行表达式不能为空"
,
trigger
:
"blur"
}
]
}
};
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"sys_job_group"
).
then
(
response
=>
{
this
.
jobGroupOptions
=
response
.
data
;
});
this
.
getDicts
(
"sys_job_status"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询定时任务列表 */
getList
()
{
this
.
loading
=
true
;
listJob
(
this
.
queryParams
).
then
(
response
=>
{
this
.
jobList
=
response
.
rows
;
this
.
total
=
response
.
total
;
this
.
loading
=
false
;
});
},
// 任务组名字典翻译
jobGroupFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
jobGroupOptions
,
row
.
jobGroup
);
},
// 状态字典翻译
statusFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
statusOptions
,
row
.
status
);
},
// 取消按钮
cancel
()
{
this
.
open
=
false
;
this
.
reset
();
},
// 表单重置
reset
()
{
this
.
form
=
{
jobId
:
undefined
,
jobName
:
undefined
,
jobGroup
:
undefined
,
invokeTarget
:
undefined
,
cronExpression
:
undefined
,
misfirePolicy
:
1
,
concurrent
:
1
,
status
:
"0"
};
this
.
resetForm
(
"form"
);
},
/** 搜索按钮操作 */
handleQuery
()
{
this
.
queryParams
.
pageNum
=
1
;
this
.
getList
();
},
/** 重置按钮操作 */
resetQuery
()
{
this
.
resetForm
(
"queryForm"
);
this
.
handleQuery
();
},
// 多选框选中数据
handleSelectionChange
(
selection
)
{
this
.
ids
=
selection
.
map
(
item
=>
item
.
jobId
);
this
.
single
=
selection
.
length
!=
1
;
this
.
multiple
=
!
selection
.
length
;
},
// 任务状态修改
handleStatusChange
(
row
)
{
let
text
=
row
.
status
===
"0"
?
"启用"
:
"停用"
;
this
.
$confirm
(
'确认要"'
+
text
+
'""'
+
row
.
jobName
+
'"任务吗?'
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
changeJobStatus
(
row
.
jobId
,
row
.
status
);
}).
then
(()
=>
{
this
.
msgSuccess
(
text
+
"成功"
);
}).
catch
(
function
()
{
row
.
status
=
row
.
status
===
"0"
?
"1"
:
"0"
;
});
},
/* 立即执行一次 */
handleRun
(
row
)
{
this
.
$confirm
(
'确认要立即执行一次"'
+
row
.
jobName
+
'"任务吗?'
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
runJob
(
row
.
jobId
,
row
.
jobGroup
);
}).
then
(
function
()
{
this
.
msgSuccess
(
"执行成功"
);
}).
catch
(
function
()
{});
},
/** 任务详细信息 */
handleView
(
row
)
{
getJob
(
row
.
jobId
).
then
(
response
=>
{
this
.
form
=
response
.
data
;
this
.
openView
=
true
;
});
},
/** 任务日志列表查询 */
handleJobLog
()
{
this
.
$router
.
push
(
"/job/log"
);
},
/** 新增按钮操作 */
handleAdd
()
{
this
.
reset
();
this
.
open
=
true
;
this
.
title
=
"添加任务"
;
},
/** 修改按钮操作 */
handleUpdate
(
row
)
{
this
.
reset
();
const
jobId
=
row
.
jobId
||
this
.
ids
;
getJob
(
jobId
).
then
(
response
=>
{
this
.
form
=
response
.
data
;
this
.
open
=
true
;
this
.
title
=
"修改任务"
;
});
},
/** 提交按钮 */
submitForm
:
function
()
{
this
.
$refs
[
"form"
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
this
.
form
.
jobId
!=
undefined
)
{
updateJob
(
this
.
form
).
then
(
response
=>
{
if
(
response
.
code
===
200
)
{
this
.
msgSuccess
(
"修改成功"
);
this
.
open
=
false
;
this
.
getList
();
}
else
{
this
.
msgError
(
response
.
msg
);
}
});
}
else
{
addJob
(
this
.
form
).
then
(
response
=>
{
if
(
response
.
code
===
200
)
{
this
.
msgSuccess
(
"新增成功"
);
this
.
open
=
false
;
this
.
getList
();
}
else
{
this
.
msgError
(
response
.
msg
);
}
});
}
}
});
},
/** 删除按钮操作 */
handleDelete
(
row
)
{
const
jobIds
=
row
.
jobId
||
this
.
ids
;
this
.
$confirm
(
'是否确认删除定时任务编号为"'
+
jobIds
+
'"的数据项?'
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
delJob
(
jobIds
);
}).
then
(()
=>
{
this
.
getList
();
this
.
msgSuccess
(
"删除成功"
);
}).
catch
(
function
()
{});
},
/** 导出按钮操作 */
handleExport
()
{
const
queryParams
=
this
.
queryParams
;
this
.
$confirm
(
"是否确认导出所有定时任务数据项?"
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
exportJob
(
queryParams
);
}).
then
(
response
=>
{
this
.
download
(
response
.
msg
);
}).
catch
(
function
()
{});
}
}
};
</
script
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/views/monitor/job/log.vue
0 → 100644
浏览文件 @
2cc14e5f
<
template
>
<div
class=
"app-container"
>
<el-form
:model=
"queryParams"
ref=
"queryForm"
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"任务名称"
prop=
"jobName"
>
<el-input
v-model=
"queryParams.jobName"
placeholder=
"请输入任务名称"
clearable
size=
"small"
style=
"width: 240px"
@
keyup
.
enter
.
native=
"handleQuery"
/>
</el-form-item>
<el-form-item
label=
"任务组名"
prop=
"jobGroup"
>
<el-select
v-model=
"queryParams.jobGroup"
placeholder=
"请任务组名"
clearable
size=
"small"
style=
"width: 240px"
>
<el-option
v-for=
"dict in jobGroupOptions"
:key=
"dict.dictValue"
:label=
"dict.dictLabel"
:value=
"dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"执行状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"请选择执行状态"
clearable
size=
"small"
style=
"width: 240px"
>
<el-option
v-for=
"dict in statusOptions"
:key=
"dict.dictValue"
:label=
"dict.dictLabel"
:value=
"dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"执行时间"
>
<el-date-picker
v-model=
"dateRange"
size=
"small"
style=
"width: 240px"
value-format=
"yyyy-MM-dd"
type=
"daterange"
range-separator=
"-"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type=
"primary"
icon=
"el-icon-search"
size=
"mini"
@
click=
"handleQuery"
>
搜索
</el-button>
<el-button
icon=
"el-icon-refresh"
size=
"mini"
@
click=
"resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<el-row
:gutter=
"10"
class=
"mb8"
>
<el-col
:span=
"1.5"
>
<el-button
type=
"danger"
icon=
"el-icon-delete"
size=
"mini"
:disabled=
"multiple"
@
click=
"handleDelete"
v-hasPermi=
"['monitor:job:remove']"
>
删除
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"danger"
icon=
"el-icon-delete"
size=
"mini"
@
click=
"handleClean"
v-hasPermi=
"['monitor:job:remove']"
>
清空
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"warning"
icon=
"el-icon-download"
size=
"mini"
@
click=
"handleExport"
v-hasPermi=
"['monitor:jobLog:export']"
>
导出
</el-button>
</el-col>
</el-row>
<el-table
v-loading=
"loading"
:data=
"jobLogList"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
<el-table-column
label=
"日志编号"
width=
"80"
align=
"center"
prop=
"jobLogId"
/>
<el-table-column
label=
"任务名称"
align=
"center"
prop=
"jobName"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"任务组名"
align=
"center"
prop=
"jobGroup"
:formatter=
"jobGroupFormat"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"调用目标字符串"
align=
"center"
prop=
"invokeTarget"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"日志信息"
align=
"center"
prop=
"jobMessage"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"执行状态"
align=
"center"
prop=
"status"
:formatter=
"statusFormat"
/>
<el-table-column
label=
"执行时间"
align=
"center"
prop=
"createTime"
width=
"180"
>
<template
slot-scope=
"scope"
>
<span>
{{
parseTime
(
scope
.
row
.
createTime
)
}}
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
align=
"center"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
<el-button
size=
"mini"
type=
"text"
icon=
"el-icon-view"
@
click=
"handleView(scope.row)"
v-hasPermi=
"['monitor:job:query']"
>
详细
</el-button>
</
template
>
</el-table-column>
</el-table>
<pagination
v-show=
"total>0"
:total=
"total"
:page
.
sync=
"queryParams.pageNum"
:limit
.
sync=
"queryParams.pageSize"
@
pagination=
"getList"
/>
<!-- 调度日志详细 -->
<el-dialog
title=
"调度日志详细"
:visible
.
sync=
"open"
width=
"700px"
>
<el-form
ref=
"form"
:model=
"form"
label-width=
"100px"
size=
"mini"
>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"日志序号:"
>
{{ form.jobLogId }}
</el-form-item>
<el-form-item
label=
"任务名称:"
>
{{ form.jobName }}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"任务分组:"
>
{{ form.jobGroup }}
</el-form-item>
<el-form-item
label=
"执行时间:"
>
{{ form.createTime }}
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"调用方法:"
>
{{ form.invokeTarget }}
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"日志信息:"
>
{{ form.jobMessage }}
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"执行状态:"
>
<div
v-if=
"form.status == 0"
>
正常
</div>
<div
v-else-if=
"form.status == 1"
>
失败
</div>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"异常信息:"
v-if=
"form.status == 1"
>
{{ form.exceptionInfo }}
</el-form-item>
</el-col>
</el-row>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"open = false"
>
关 闭
</el-button>
</div>
</el-dialog>
</div>
</template>
<
script
>
import
{
listJobLog
,
delJobLog
,
exportJobLog
,
cleanJobLog
}
from
"@/api/monitor/jobLog"
;
export
default
{
name
:
"JobLog"
,
data
()
{
return
{
// 遮罩层
loading
:
true
,
// 选中数组
ids
:
[],
// 非多个禁用
multiple
:
true
,
// 总条数
total
:
0
,
// 调度日志表格数据
jobLogList
:
[],
// 是否显示弹出层
open
:
false
,
// 日期范围
dateRange
:
[],
// 表单参数
form
:
{},
// 执行状态字典
statusOptions
:
[],
// 任务组名字典
jobGroupOptions
:
[],
// 查询参数
queryParams
:
{
pageNum
:
1
,
pageSize
:
10
,
jobName
:
undefined
,
jobGroup
:
undefined
,
status
:
undefined
},
// 表单参数
form
:
{}
};
},
created
()
{
this
.
getList
();
this
.
getDicts
(
"sys_job_status"
).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
;
});
this
.
getDicts
(
"sys_job_group"
).
then
(
response
=>
{
this
.
jobGroupOptions
=
response
.
data
;
});
},
methods
:
{
/** 查询调度日志列表 */
getList
()
{
this
.
loading
=
true
;
listJobLog
(
this
.
addDateRange
(
this
.
queryParams
,
this
.
dateRange
)).
then
(
response
=>
{
this
.
jobLogList
=
response
.
rows
;
this
.
total
=
response
.
total
;
this
.
loading
=
false
;
}
);
},
// 执行状态字典翻译
statusFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
statusOptions
,
row
.
status
);
},
// 任务组名字典翻译
jobGroupFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
jobGroupOptions
,
row
.
jobGroup
);
},
/** 搜索按钮操作 */
handleQuery
()
{
this
.
queryParams
.
pageNum
=
1
;
this
.
getList
();
},
/** 重置按钮操作 */
resetQuery
()
{
this
.
dateRange
=
[];
this
.
resetForm
(
"queryForm"
);
this
.
handleQuery
();
},
// 多选框选中数据
handleSelectionChange
(
selection
)
{
this
.
ids
=
selection
.
map
(
item
=>
item
.
jobLogId
);
this
.
multiple
=
!
selection
.
length
;
},
/** 详细按钮操作 */
handleView
(
row
)
{
this
.
open
=
true
;
this
.
form
=
row
;
},
/** 删除按钮操作 */
handleDelete
(
row
)
{
const
jobLogIds
=
this
.
ids
;
this
.
$confirm
(
'是否确认删除调度日志编号为"'
+
jobLogIds
+
'"的数据项?'
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
delJobLog
(
jobLogIds
);
}).
then
(()
=>
{
this
.
getList
();
this
.
msgSuccess
(
"删除成功"
);
}).
catch
(
function
()
{});
},
/** 清空按钮操作 */
handleClean
()
{
this
.
$confirm
(
"是否确认清空所有调度日志数据项?"
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
cleanJobLog
();
}).
then
(()
=>
{
this
.
getList
();
this
.
msgSuccess
(
"清空成功"
);
}).
catch
(
function
()
{});
},
/** 导出按钮操作 */
handleExport
()
{
const
queryParams
=
this
.
queryParams
;
this
.
$confirm
(
"是否确认导出所有调度日志数据项?"
,
"警告"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(
function
()
{
return
exportJobLog
(
queryParams
);
}).
then
(
response
=>
{
this
.
download
(
response
.
msg
);
}).
catch
(
function
()
{});
}
}
};
</
script
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/pom.xml
浏览文件 @
2cc14e5f
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
<groupId>
com.ruoyi
</groupId>
<groupId>
com.ruoyi
</groupId>
<artifactId>
ruoyi
</artifactId>
<artifactId>
ruoyi
</artifactId>
<version>
2.
1
.0
</version>
<version>
2.
2
.0
</version>
<packaging>
jar
</packaging>
<packaging>
jar
</packaging>
<name>
ruoyi
</name>
<name>
ruoyi
</name>
...
@@ -224,6 +224,7 @@
...
@@ -224,6 +224,7 @@
<artifactId>
poi-ooxml
</artifactId>
<artifactId>
poi-ooxml
</artifactId>
<version>
${poi.version}
</version>
<version>
${poi.version}
</version>
</dependency>
</dependency>
<!--velocity代码生成使用模板 -->
<!--velocity代码生成使用模板 -->
<dependency>
<dependency>
<groupId>
org.apache.velocity
</groupId>
<groupId>
org.apache.velocity
</groupId>
...
@@ -231,6 +232,18 @@
...
@@ -231,6 +232,18 @@
<version>
${velocity.version}
</version>
<version>
${velocity.version}
</version>
</dependency>
</dependency>
<!-- 定时任务 -->
<dependency>
<groupId>
org.quartz-scheduler
</groupId>
<artifactId>
quartz
</artifactId>
<exclusions>
<exclusion>
<groupId>
com.mchange
</groupId>
<artifactId>
c3p0
</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencies>
<build>
<build>
...
...
This diff is collapsed.
Click to expand it.
ruoyi/sql/quartz.sql
0 → 100644
浏览文件 @
2cc14e5f
-- ----------------------------
-- 1、存储每一个已配置的 jobDetail 的详细信息
-- ----------------------------
drop
table
if
exists
QRTZ_JOB_DETAILS
;
create
table
QRTZ_JOB_DETAILS
(
sched_name
varchar
(
120
)
not
null
,
job_name
varchar
(
200
)
not
null
,
job_group
varchar
(
200
)
not
null
,
description
varchar
(
250
)
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
null
,
primary
key
(
sched_name
,
job_name
,
job_group
)
)
engine
=
innodb
;
-- ----------------------------
-- 2、 存储已配置的 Trigger 的信息
-- ----------------------------
drop
table
if
exists
QRTZ_TRIGGERS
;
create
table
QRTZ_TRIGGERS
(
sched_name
varchar
(
120
)
not
null
,
trigger_name
varchar
(
200
)
not
null
,
trigger_group
varchar
(
200
)
not
null
,
job_name
varchar
(
200
)
not
null
,
job_group
varchar
(
200
)
not
null
,
description
varchar
(
250
)
null
,
next_fire_time
bigint
(
13
)
null
,
prev_fire_time
bigint
(
13
)
null
,
priority
integer
null
,
trigger_state
varchar
(
16
)
not
null
,
trigger_type
varchar
(
8
)
not
null
,
start_time
bigint
(
13
)
not
null
,
end_time
bigint
(
13
)
null
,
calendar_name
varchar
(
200
)
null
,
misfire_instr
smallint
(
2
)
null
,
job_data
blob
null
,
primary
key
(
sched_name
,
trigger_name
,
trigger_group
),
foreign
key
(
sched_name
,
job_name
,
job_group
)
references
QRTZ_JOB_DETAILS
(
sched_name
,
job_name
,
job_group
)
)
engine
=
innodb
;
-- ----------------------------
-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数
-- ----------------------------
drop
table
if
exists
QRTZ_SIMPLE_TRIGGERS
;
create
table
QRTZ_SIMPLE_TRIGGERS
(
sched_name
varchar
(
120
)
not
null
,
trigger_name
varchar
(
200
)
not
null
,
trigger_group
varchar
(
200
)
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
),
foreign
key
(
sched_name
,
trigger_name
,
trigger_group
)
references
QRTZ_TRIGGERS
(
sched_name
,
trigger_name
,
trigger_group
)
)
engine
=
innodb
;
-- ----------------------------
-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息
-- ----------------------------
drop
table
if
exists
QRTZ_CRON_TRIGGERS
;
create
table
QRTZ_CRON_TRIGGERS
(
sched_name
varchar
(
120
)
not
null
,
trigger_name
varchar
(
200
)
not
null
,
trigger_group
varchar
(
200
)
not
null
,
cron_expression
varchar
(
200
)
not
null
,
time_zone_id
varchar
(
80
),
primary
key
(
sched_name
,
trigger_name
,
trigger_group
),
foreign
key
(
sched_name
,
trigger_name
,
trigger_group
)
references
QRTZ_TRIGGERS
(
sched_name
,
trigger_name
,
trigger_group
)
)
engine
=
innodb
;
-- ----------------------------
-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
-- ----------------------------
drop
table
if
exists
QRTZ_BLOB_TRIGGERS
;
create
table
QRTZ_BLOB_TRIGGERS
(
sched_name
varchar
(
120
)
not
null
,
trigger_name
varchar
(
200
)
not
null
,
trigger_group
varchar
(
200
)
not
null
,
blob_data
blob
null
,
primary
key
(
sched_name
,
trigger_name
,
trigger_group
),
foreign
key
(
sched_name
,
trigger_name
,
trigger_group
)
references
QRTZ_TRIGGERS
(
sched_name
,
trigger_name
,
trigger_group
)
)
engine
=
innodb
;
-- ----------------------------
-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围
-- ----------------------------
drop
table
if
exists
QRTZ_CALENDARS
;
create
table
QRTZ_CALENDARS
(
sched_name
varchar
(
120
)
not
null
,
calendar_name
varchar
(
200
)
not
null
,
calendar
blob
not
null
,
primary
key
(
sched_name
,
calendar_name
)
)
engine
=
innodb
;
-- ----------------------------
-- 7、 存储已暂停的 Trigger 组的信息
-- ----------------------------
drop
table
if
exists
QRTZ_PAUSED_TRIGGER_GRPS
;
create
table
QRTZ_PAUSED_TRIGGER_GRPS
(
sched_name
varchar
(
120
)
not
null
,
trigger_group
varchar
(
200
)
not
null
,
primary
key
(
sched_name
,
trigger_group
)
)
engine
=
innodb
;
-- ----------------------------
-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
-- ----------------------------
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
(
200
)
not
null
,
trigger_group
varchar
(
200
)
not
null
,
instance_name
varchar
(
200
)
not
null
,
fired_time
bigint
(
13
)
not
null
,
sched_time
bigint
(
13
)
not
null
,
priority
integer
not
null
,
state
varchar
(
16
)
not
null
,
job_name
varchar
(
200
)
null
,
job_group
varchar
(
200
)
null
,
is_nonconcurrent
varchar
(
1
)
null
,
requests_recovery
varchar
(
1
)
null
,
primary
key
(
sched_name
,
entry_id
)
)
engine
=
innodb
;
-- ----------------------------
-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例
-- ----------------------------
drop
table
if
exists
QRTZ_SCHEDULER_STATE
;
create
table
QRTZ_SCHEDULER_STATE
(
sched_name
varchar
(
120
)
not
null
,
instance_name
varchar
(
200
)
not
null
,
last_checkin_time
bigint
(
13
)
not
null
,
checkin_interval
bigint
(
13
)
not
null
,
primary
key
(
sched_name
,
instance_name
)
)
engine
=
innodb
;
-- ----------------------------
-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)
-- ----------------------------
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
;
drop
table
if
exists
QRTZ_SIMPROP_TRIGGERS
;
create
table
QRTZ_SIMPROP_TRIGGERS
(
sched_name
varchar
(
120
)
not
null
,
trigger_name
varchar
(
200
)
not
null
,
trigger_group
varchar
(
200
)
not
null
,
str_prop_1
varchar
(
512
)
null
,
str_prop_2
varchar
(
512
)
null
,
str_prop_3
varchar
(
512
)
null
,
int_prop_1
int
null
,
int_prop_2
int
null
,
long_prop_1
bigint
null
,
long_prop_2
bigint
null
,
dec_prop_1
numeric
(
13
,
4
)
null
,
dec_prop_2
numeric
(
13
,
4
)
null
,
bool_prop_1
varchar
(
1
)
null
,
bool_prop_2
varchar
(
1
)
null
,
primary
key
(
sched_name
,
trigger_name
,
trigger_group
),
foreign
key
(
sched_name
,
trigger_name
,
trigger_group
)
references
QRTZ_TRIGGERS
(
sched_name
,
trigger_name
,
trigger_group
)
)
engine
=
innodb
;
commit
;
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java
浏览文件 @
2cc14e5f
...
@@ -14,7 +14,7 @@ public class RuoYiApplication
...
@@ -14,7 +14,7 @@ public class RuoYiApplication
{
{
public
static
void
main
(
String
[]
args
)
public
static
void
main
(
String
[]
args
)
{
{
//
System.setProperty("spring.devtools.restart.enabled", "false");
System
.
setProperty
(
"spring.devtools.restart.enabled"
,
"false"
);
SpringApplication
.
run
(
RuoYiApplication
.
class
,
args
);
SpringApplication
.
run
(
RuoYiApplication
.
class
,
args
);
System
.
out
.
println
(
"(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n"
+
System
.
out
.
println
(
"(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n"
+
" .-------. ____ __ \n"
+
" .-------. ____ __ \n"
+
...
...
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
constant
;
/**
* 任务调度通用常量
*
* @author ruoyi
*/
public
interface
ScheduleConstants
{
public
static
final
String
TASK_CLASS_NAME
=
"TASK_CLASS_NAME"
;
/** 执行目标key */
public
static
final
String
TASK_PROPERTIES
=
"TASK_PROPERTIES"
;
/** 默认 */
public
static
final
String
MISFIRE_DEFAULT
=
"0"
;
/** 立即触发执行 */
public
static
final
String
MISFIRE_IGNORE_MISFIRES
=
"1"
;
/** 触发一次执行 */
public
static
final
String
MISFIRE_FIRE_AND_PROCEED
=
"2"
;
/** 不触发立即执行 */
public
static
final
String
MISFIRE_DO_NOTHING
=
"3"
;
public
enum
Status
{
/**
* 正常
*/
NORMAL
(
"0"
),
/**
* 暂停
*/
PAUSE
(
"1"
);
private
String
value
;
private
Status
(
String
value
)
{
this
.
value
=
value
;
}
public
String
getValue
()
{
return
value
;
}
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/exception/job/TaskException.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
exception
.
job
;
/**
* 计划策略异常
*
* @author ruoyi
*/
public
class
TaskException
extends
Exception
{
private
static
final
long
serialVersionUID
=
1L
;
private
Code
code
;
public
TaskException
(
String
msg
,
Code
code
)
{
this
(
msg
,
code
,
null
);
}
public
TaskException
(
String
msg
,
Code
code
,
Exception
nestedEx
)
{
super
(
msg
,
nestedEx
);
this
.
code
=
code
;
}
public
Code
getCode
()
{
return
code
;
}
public
enum
Code
{
TASK_EXISTS
,
NO_TASK_EXISTS
,
TASK_ALREADY_STARTED
,
UNKNOWN
,
CONFIG_ERROR
,
TASK_NODE_NOT_AVAILABLE
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
;
import
java.io.PrintWriter
;
import
java.io.StringWriter
;
import
org.apache.commons.lang3.exception.ExceptionUtils
;
/**
* 错误信息处理类。
*
* @author ruoyi
*/
public
class
ExceptionUtil
{
/**
* 获取exception的详细错误信息。
*/
public
static
String
getExceptionMessage
(
Throwable
e
)
{
StringWriter
sw
=
new
StringWriter
();
e
.
printStackTrace
(
new
PrintWriter
(
sw
,
true
));
String
str
=
sw
.
toString
();
return
str
;
}
public
static
String
getRootErrorMseeage
(
Exception
e
)
{
Throwable
root
=
ExceptionUtils
.
getRootCause
(
e
);
root
=
(
root
==
null
?
e
:
root
);
if
(
root
==
null
)
{
return
""
;
}
String
msg
=
root
.
getMessage
();
if
(
msg
==
null
)
{
return
"null"
;
}
return
StringUtils
.
defaultString
(
msg
);
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
bean
;
import
java.lang.reflect.Method
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* Bean 工具类
*
* @author ruoyi
*/
public
class
BeanUtils
extends
org
.
springframework
.
beans
.
BeanUtils
{
/** Bean方法名中属性名开始的下标 */
private
static
final
int
BEAN_METHOD_PROP_INDEX
=
3
;
/** * 匹配getter方法的正则表达式 */
private
static
final
Pattern
GET_PATTERN
=
Pattern
.
compile
(
"get(\\p{javaUpperCase}\\w*)"
);
/** * 匹配setter方法的正则表达式 */
private
static
final
Pattern
SET_PATTERN
=
Pattern
.
compile
(
"set(\\p{javaUpperCase}\\w*)"
);
/**
* Bean属性复制工具方法。
*
* @param dest 目标对象
* @param src 源对象
*/
public
static
void
copyBeanProp
(
Object
dest
,
Object
src
)
{
try
{
copyProperties
(
src
,
dest
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 获取对象的setter方法。
*
* @param obj 对象
* @return 对象的setter方法列表
*/
public
static
List
<
Method
>
getSetterMethods
(
Object
obj
)
{
// setter方法列表
List
<
Method
>
setterMethods
=
new
ArrayList
<
Method
>();
// 获取所有方法
Method
[]
methods
=
obj
.
getClass
().
getMethods
();
// 查找setter方法
for
(
Method
method
:
methods
)
{
Matcher
m
=
SET_PATTERN
.
matcher
(
method
.
getName
());
if
(
m
.
matches
()
&&
(
method
.
getParameterTypes
().
length
==
1
))
{
setterMethods
.
add
(
method
);
}
}
// 返回setter方法列表
return
setterMethods
;
}
/**
* 获取对象的getter方法。
*
* @param obj 对象
* @return 对象的getter方法列表
*/
public
static
List
<
Method
>
getGetterMethods
(
Object
obj
)
{
// getter方法列表
List
<
Method
>
getterMethods
=
new
ArrayList
<
Method
>();
// 获取所有方法
Method
[]
methods
=
obj
.
getClass
().
getMethods
();
// 查找getter方法
for
(
Method
method
:
methods
)
{
Matcher
m
=
GET_PATTERN
.
matcher
(
method
.
getName
());
if
(
m
.
matches
()
&&
(
method
.
getParameterTypes
().
length
==
0
))
{
getterMethods
.
add
(
method
);
}
}
// 返回getter方法列表
return
getterMethods
;
}
/**
* 检查Bean方法名中的属性名是否相等。<br>
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
*
* @param m1 方法名1
* @param m2 方法名2
* @return 属性名一样返回true,否则返回false
*/
public
static
boolean
isMethodPropEquals
(
String
m1
,
String
m2
)
{
return
m1
.
substring
(
BEAN_METHOD_PROP_INDEX
).
equals
(
m2
.
substring
(
BEAN_METHOD_PROP_INDEX
));
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
浏览文件 @
2cc14e5f
...
@@ -21,7 +21,6 @@ public class HttpHelper
...
@@ -21,7 +21,6 @@ public class HttpHelper
public
static
String
getBodyString
(
ServletRequest
request
)
public
static
String
getBodyString
(
ServletRequest
request
)
{
{
StringBuilder
sb
=
new
StringBuilder
();
StringBuilder
sb
=
new
StringBuilder
();
BufferedReader
reader
=
null
;
BufferedReader
reader
=
null
;
try
(
InputStream
inputStream
=
request
.
getInputStream
())
try
(
InputStream
inputStream
=
request
.
getInputStream
())
...
...
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/job/AbstractQuartzJob.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
job
;
import
java.util.Date
;
import
org.quartz.Job
;
import
org.quartz.JobExecutionContext
;
import
org.quartz.JobExecutionException
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.ruoyi.common.constant.Constants
;
import
com.ruoyi.common.constant.ScheduleConstants
;
import
com.ruoyi.common.utils.ExceptionUtil
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.bean.BeanUtils
;
import
com.ruoyi.common.utils.spring.SpringUtils
;
import
com.ruoyi.project.monitor.domain.SysJob
;
import
com.ruoyi.project.monitor.domain.SysJobLog
;
import
com.ruoyi.project.monitor.service.ISysJobLogService
;
/**
* 抽象quartz调用
*
* @author ruoyi
*/
public
abstract
class
AbstractQuartzJob
implements
Job
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
AbstractQuartzJob
.
class
);
/**
* 线程本地变量
*/
private
static
ThreadLocal
<
Date
>
threadLocal
=
new
ThreadLocal
<>();
@Override
public
void
execute
(
JobExecutionContext
context
)
throws
JobExecutionException
{
SysJob
sysJob
=
new
SysJob
();
BeanUtils
.
copyBeanProp
(
sysJob
,
context
.
getMergedJobDataMap
().
get
(
ScheduleConstants
.
TASK_PROPERTIES
));
try
{
before
(
context
,
sysJob
);
if
(
sysJob
!=
null
)
{
doExecute
(
context
,
sysJob
);
}
after
(
context
,
sysJob
,
null
);
}
catch
(
Exception
e
)
{
log
.
error
(
"任务执行异常 - :"
,
e
);
after
(
context
,
sysJob
,
e
);
}
}
/**
* 执行前
*
* @param context 工作执行上下文对象
* @param sysJob 系统计划任务
*/
protected
void
before
(
JobExecutionContext
context
,
SysJob
sysJob
)
{
threadLocal
.
set
(
new
Date
());
}
/**
* 执行后
*
* @param context 工作执行上下文对象
* @param sysScheduleJob 系统计划任务
*/
protected
void
after
(
JobExecutionContext
context
,
SysJob
sysJob
,
Exception
e
)
{
Date
startTime
=
threadLocal
.
get
();
threadLocal
.
remove
();
final
SysJobLog
sysJobLog
=
new
SysJobLog
();
sysJobLog
.
setJobName
(
sysJob
.
getJobName
());
sysJobLog
.
setJobGroup
(
sysJob
.
getJobGroup
());
sysJobLog
.
setInvokeTarget
(
sysJob
.
getInvokeTarget
());
sysJobLog
.
setStartTime
(
startTime
);
sysJobLog
.
setStopTime
(
new
Date
());
long
runMs
=
sysJobLog
.
getStopTime
().
getTime
()
-
sysJobLog
.
getStartTime
().
getTime
();
sysJobLog
.
setJobMessage
(
sysJobLog
.
getJobName
()
+
" 总共耗时:"
+
runMs
+
"毫秒"
);
if
(
e
!=
null
)
{
sysJobLog
.
setStatus
(
Constants
.
FAIL
);
String
errorMsg
=
StringUtils
.
substring
(
ExceptionUtil
.
getExceptionMessage
(
e
),
0
,
2000
);
sysJobLog
.
setExceptionInfo
(
errorMsg
);
}
else
{
sysJobLog
.
setStatus
(
Constants
.
SUCCESS
);
}
// 写入数据库当中
SpringUtils
.
getBean
(
ISysJobLogService
.
class
).
addJobLog
(
sysJobLog
);
}
/**
* 执行方法,由子类重载
*
* @param context 工作执行上下文对象
* @param sysJob 系统计划任务
* @throws Exception 执行过程中的异常
*/
protected
abstract
void
doExecute
(
JobExecutionContext
context
,
SysJob
sysJob
)
throws
Exception
;
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/job/CronUtils.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
job
;
import
java.text.ParseException
;
import
java.util.Date
;
import
org.quartz.CronExpression
;
/**
* cron表达式工具类
*
* @author ruoyi
*
*/
public
class
CronUtils
{
/**
* 返回一个布尔值代表一个给定的Cron表达式的有效性
*
* @param cronExpression Cron表达式
* @return boolean 表达式是否有效
*/
public
static
boolean
isValid
(
String
cronExpression
)
{
return
CronExpression
.
isValidExpression
(
cronExpression
);
}
/**
* 返回一个字符串值,表示该消息无效Cron表达式给出有效性
*
* @param cronExpression Cron表达式
* @return String 无效时返回表达式错误描述,如果有效返回null
*/
public
static
String
getInvalidMessage
(
String
cronExpression
)
{
try
{
new
CronExpression
(
cronExpression
);
return
null
;
}
catch
(
ParseException
pe
)
{
return
pe
.
getMessage
();
}
}
/**
* 返回下一个执行时间根据给定的Cron表达式
*
* @param cronExpression Cron表达式
* @return Date 下次Cron表达式执行时间
*/
public
static
Date
getNextExecution
(
String
cronExpression
)
{
try
{
CronExpression
cron
=
new
CronExpression
(
cronExpression
);
return
cron
.
getNextValidTimeAfter
(
new
Date
(
System
.
currentTimeMillis
()));
}
catch
(
ParseException
e
)
{
throw
new
IllegalArgumentException
(
e
.
getMessage
());
}
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/job/JobInvokeUtil.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
job
;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.util.LinkedList
;
import
java.util.List
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.spring.SpringUtils
;
import
com.ruoyi.project.monitor.domain.SysJob
;
/**
* 任务执行工具
*
* @author ruoyi
*/
public
class
JobInvokeUtil
{
/**
* 执行方法
*
* @param sysJob 系统任务
*/
public
static
void
invokeMethod
(
SysJob
sysJob
)
throws
Exception
{
String
invokeTarget
=
sysJob
.
getInvokeTarget
();
String
beanName
=
getBeanName
(
invokeTarget
);
String
methodName
=
getMethodName
(
invokeTarget
);
List
<
Object
[]>
methodParams
=
getMethodParams
(
invokeTarget
);
if
(!
isValidClassName
(
beanName
))
{
Object
bean
=
SpringUtils
.
getBean
(
beanName
);
invokeMethod
(
bean
,
methodName
,
methodParams
);
}
else
{
Object
bean
=
Class
.
forName
(
beanName
).
newInstance
();
invokeMethod
(
bean
,
methodName
,
methodParams
);
}
}
/**
* 调用任务方法
*
* @param bean 目标对象
* @param methodName 方法名称
* @param methodParams 方法参数
*/
private
static
void
invokeMethod
(
Object
bean
,
String
methodName
,
List
<
Object
[]>
methodParams
)
throws
NoSuchMethodException
,
SecurityException
,
IllegalAccessException
,
IllegalArgumentException
,
InvocationTargetException
{
if
(
StringUtils
.
isNotNull
(
methodParams
)
&&
methodParams
.
size
()
>
0
)
{
Method
method
=
bean
.
getClass
().
getDeclaredMethod
(
methodName
,
getMethodParamsType
(
methodParams
));
method
.
invoke
(
bean
,
getMethodParamsValue
(
methodParams
));
}
else
{
Method
method
=
bean
.
getClass
().
getDeclaredMethod
(
methodName
);
method
.
invoke
(
bean
);
}
}
/**
* 校验是否为为class包名
*
* @param str 名称
* @return true是 false否
*/
public
static
boolean
isValidClassName
(
String
invokeTarget
)
{
return
StringUtils
.
countMatches
(
invokeTarget
,
"."
)
>
1
;
}
/**
* 获取bean名称
*
* @param invokeTarget 目标字符串
* @return bean名称
*/
public
static
String
getBeanName
(
String
invokeTarget
)
{
String
beanName
=
StringUtils
.
substringBefore
(
invokeTarget
,
"("
);
return
StringUtils
.
substringBeforeLast
(
beanName
,
"."
);
}
/**
* 获取bean方法
*
* @param invokeTarget 目标字符串
* @return method方法
*/
public
static
String
getMethodName
(
String
invokeTarget
)
{
String
methodName
=
StringUtils
.
substringBefore
(
invokeTarget
,
"("
);
return
StringUtils
.
substringAfterLast
(
methodName
,
"."
);
}
/**
* 获取method方法参数相关列表
*
* @param invokeTarget 目标字符串
* @return method方法相关参数列表
*/
public
static
List
<
Object
[]>
getMethodParams
(
String
invokeTarget
)
{
String
methodStr
=
StringUtils
.
substringBetween
(
invokeTarget
,
"("
,
")"
);
if
(
StringUtils
.
isEmpty
(
methodStr
))
{
return
null
;
}
String
[]
methodParams
=
methodStr
.
split
(
","
);
List
<
Object
[]>
classs
=
new
LinkedList
<>();
for
(
int
i
=
0
;
i
<
methodParams
.
length
;
i
++)
{
String
str
=
StringUtils
.
trimToEmpty
(
methodParams
[
i
]);
// String字符串类型,包含'
if
(
StringUtils
.
contains
(
str
,
"'"
))
{
classs
.
add
(
new
Object
[]
{
StringUtils
.
replace
(
str
,
"'"
,
""
),
String
.
class
});
}
// boolean布尔类型,等于true或者false
else
if
(
StringUtils
.
equals
(
str
,
"true"
)
||
StringUtils
.
equalsIgnoreCase
(
str
,
"false"
))
{
classs
.
add
(
new
Object
[]
{
Boolean
.
valueOf
(
str
),
Boolean
.
class
});
}
// long长整形,包含L
else
if
(
StringUtils
.
containsIgnoreCase
(
str
,
"L"
))
{
classs
.
add
(
new
Object
[]
{
Long
.
valueOf
(
StringUtils
.
replaceIgnoreCase
(
str
,
"L"
,
""
)),
Long
.
class
});
}
// double浮点类型,包含D
else
if
(
StringUtils
.
containsIgnoreCase
(
str
,
"D"
))
{
classs
.
add
(
new
Object
[]
{
Double
.
valueOf
(
StringUtils
.
replaceIgnoreCase
(
str
,
"D"
,
""
)),
Double
.
class
});
}
// 其他类型归类为整形
else
{
classs
.
add
(
new
Object
[]
{
Integer
.
valueOf
(
str
),
Integer
.
class
});
}
}
return
classs
;
}
/**
* 获取参数类型
*
* @param methodParams 参数相关列表
* @return 参数类型列表
*/
public
static
Class
<?>[]
getMethodParamsType
(
List
<
Object
[]>
methodParams
)
{
Class
<?>[]
classs
=
new
Class
<?>[
methodParams
.
size
()];
int
index
=
0
;
for
(
Object
[]
os
:
methodParams
)
{
classs
[
index
]
=
(
Class
<?>)
os
[
1
];
index
++;
}
return
classs
;
}
/**
* 获取参数值
*
* @param methodParams 参数相关列表
* @return 参数值列表
*/
public
static
Object
[]
getMethodParamsValue
(
List
<
Object
[]>
methodParams
)
{
Object
[]
classs
=
new
Object
[
methodParams
.
size
()];
int
index
=
0
;
for
(
Object
[]
os
:
methodParams
)
{
classs
[
index
]
=
(
Object
)
os
[
0
];
index
++;
}
return
classs
;
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/job/QuartzDisallowConcurrentExecution.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
job
;
import
org.quartz.DisallowConcurrentExecution
;
import
org.quartz.JobExecutionContext
;
import
com.ruoyi.project.monitor.domain.SysJob
;
/**
* 定时任务处理(禁止并发执行)
*
* @author ruoyi
*
*/
@DisallowConcurrentExecution
public
class
QuartzDisallowConcurrentExecution
extends
AbstractQuartzJob
{
@Override
protected
void
doExecute
(
JobExecutionContext
context
,
SysJob
sysJob
)
throws
Exception
{
JobInvokeUtil
.
invokeMethod
(
sysJob
);
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/job/QuartzJobExecution.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
job
;
import
org.quartz.JobExecutionContext
;
import
com.ruoyi.project.monitor.domain.SysJob
;
/**
* 定时任务处理(允许并发执行)
*
* @author ruoyi
*
*/
public
class
QuartzJobExecution
extends
AbstractQuartzJob
{
@Override
protected
void
doExecute
(
JobExecutionContext
context
,
SysJob
sysJob
)
throws
Exception
{
JobInvokeUtil
.
invokeMethod
(
sysJob
);
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/common/utils/job/ScheduleUtils.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
common
.
utils
.
job
;
import
org.quartz.CronScheduleBuilder
;
import
org.quartz.CronTrigger
;
import
org.quartz.Job
;
import
org.quartz.JobBuilder
;
import
org.quartz.JobDetail
;
import
org.quartz.JobKey
;
import
org.quartz.Scheduler
;
import
org.quartz.SchedulerException
;
import
org.quartz.TriggerBuilder
;
import
org.quartz.TriggerKey
;
import
com.ruoyi.common.constant.ScheduleConstants
;
import
com.ruoyi.common.exception.job.TaskException
;
import
com.ruoyi.common.exception.job.TaskException.Code
;
import
com.ruoyi.project.monitor.domain.SysJob
;
/**
* 定时任务工具类
*
* @author ruoyi
*
*/
public
class
ScheduleUtils
{
/**
* 得到quartz任务类
*
* @param sysJob 执行计划
* @return 具体执行任务类
*/
private
static
Class
<?
extends
Job
>
getQuartzJobClass
(
SysJob
sysJob
)
{
boolean
isConcurrent
=
"0"
.
equals
(
sysJob
.
getConcurrent
());
return
isConcurrent
?
QuartzJobExecution
.
class
:
QuartzDisallowConcurrentExecution
.
class
;
}
/**
* 构建任务触发对象
*/
public
static
TriggerKey
getTriggerKey
(
Long
jobId
,
String
jobGroup
)
{
return
TriggerKey
.
triggerKey
(
ScheduleConstants
.
TASK_CLASS_NAME
+
jobId
,
jobGroup
);
}
/**
* 构建任务键对象
*/
public
static
JobKey
getJobKey
(
Long
jobId
,
String
jobGroup
)
{
return
JobKey
.
jobKey
(
ScheduleConstants
.
TASK_CLASS_NAME
+
jobId
,
jobGroup
);
}
/**
* 创建定时任务
*/
public
static
void
createScheduleJob
(
Scheduler
scheduler
,
SysJob
job
)
throws
SchedulerException
,
TaskException
{
Class
<?
extends
Job
>
jobClass
=
getQuartzJobClass
(
job
);
// 构建job信息
Long
jobId
=
job
.
getJobId
();
String
jobGroup
=
job
.
getJobGroup
();
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
jobClass
).
withIdentity
(
getJobKey
(
jobId
,
jobGroup
)).
build
();
// 表达式调度构建器
CronScheduleBuilder
cronScheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
job
.
getCronExpression
());
cronScheduleBuilder
=
handleCronScheduleMisfirePolicy
(
job
,
cronScheduleBuilder
);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger
trigger
=
TriggerBuilder
.
newTrigger
().
withIdentity
(
getTriggerKey
(
jobId
,
jobGroup
))
.
withSchedule
(
cronScheduleBuilder
).
build
();
// 放入参数,运行时的方法可以获取
jobDetail
.
getJobDataMap
().
put
(
ScheduleConstants
.
TASK_PROPERTIES
,
job
);
// 判断是否存在
if
(
scheduler
.
checkExists
(
getJobKey
(
jobId
,
jobGroup
)))
{
// 防止创建时存在数据问题 先移除,然后在执行创建操作
scheduler
.
deleteJob
(
getJobKey
(
jobId
,
jobGroup
));
}
scheduler
.
scheduleJob
(
jobDetail
,
trigger
);
// 暂停任务
if
(
job
.
getStatus
().
equals
(
ScheduleConstants
.
Status
.
PAUSE
.
getValue
()))
{
scheduler
.
pauseJob
(
ScheduleUtils
.
getJobKey
(
jobId
,
jobGroup
));
}
}
/**
* 设置定时任务策略
*/
public
static
CronScheduleBuilder
handleCronScheduleMisfirePolicy
(
SysJob
job
,
CronScheduleBuilder
cb
)
throws
TaskException
{
switch
(
job
.
getMisfirePolicy
())
{
case
ScheduleConstants
.
MISFIRE_DEFAULT
:
return
cb
;
case
ScheduleConstants
.
MISFIRE_IGNORE_MISFIRES
:
return
cb
.
withMisfireHandlingInstructionIgnoreMisfires
();
case
ScheduleConstants
.
MISFIRE_FIRE_AND_PROCEED
:
return
cb
.
withMisfireHandlingInstructionFireAndProceed
();
case
ScheduleConstants
.
MISFIRE_DO_NOTHING
:
return
cb
.
withMisfireHandlingInstructionDoNothing
();
default
:
throw
new
TaskException
(
"The task misfire policy '"
+
job
.
getMisfirePolicy
()
+
"' cannot be used in cron schedule tasks"
,
Code
.
CONFIG_ERROR
);
}
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/framework/config/ScheduleConfig.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
framework
.
config
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.scheduling.quartz.SchedulerFactoryBean
;
import
javax.sql.DataSource
;
import
java.util.Properties
;
/**
* 定时任务配置
*
* @author ruoyi
*/
@Configuration
public
class
ScheduleConfig
{
@Bean
public
SchedulerFactoryBean
schedulerFactoryBean
(
DataSource
dataSource
)
{
SchedulerFactoryBean
factory
=
new
SchedulerFactoryBean
();
factory
.
setDataSource
(
dataSource
);
// quartz参数
Properties
prop
=
new
Properties
();
prop
.
put
(
"org.quartz.scheduler.instanceName"
,
"RuoyiScheduler"
);
prop
.
put
(
"org.quartz.scheduler.instanceId"
,
"AUTO"
);
// 线程池配置
prop
.
put
(
"org.quartz.threadPool.class"
,
"org.quartz.simpl.SimpleThreadPool"
);
prop
.
put
(
"org.quartz.threadPool.threadCount"
,
"20"
);
prop
.
put
(
"org.quartz.threadPool.threadPriority"
,
"5"
);
// JobStore配置
prop
.
put
(
"org.quartz.jobStore.class"
,
"org.quartz.impl.jdbcjobstore.JobStoreTX"
);
// 集群配置
prop
.
put
(
"org.quartz.jobStore.isClustered"
,
"true"
);
prop
.
put
(
"org.quartz.jobStore.clusterCheckinInterval"
,
"15000"
);
prop
.
put
(
"org.quartz.jobStore.maxMisfiresToHandleAtATime"
,
"1"
);
prop
.
put
(
"org.quartz.jobStore.txIsolationLevelSerializable"
,
"true"
);
// sqlserver 启用
// prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
prop
.
put
(
"org.quartz.jobStore.misfireThreshold"
,
"12000"
);
prop
.
put
(
"org.quartz.jobStore.tablePrefix"
,
"QRTZ_"
);
factory
.
setQuartzProperties
(
prop
);
factory
.
setSchedulerName
(
"RuoyiScheduler"
);
// 延时启动
factory
.
setStartupDelay
(
1
);
factory
.
setApplicationContextSchedulerContextKey
(
"applicationContextKey"
);
// 可选,QuartzScheduler
// 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
factory
.
setOverwriteExistingJobs
(
true
);
// 设置自动启动,默认为true
factory
.
setAutoStartup
(
true
);
return
factory
;
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
浏览文件 @
2cc14e5f
...
@@ -99,6 +99,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
...
@@ -99,6 +99,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
).
permitAll
()
).
permitAll
()
.
antMatchers
(
"/profile/**"
).
anonymous
()
.
antMatchers
(
"/profile/**"
).
anonymous
()
.
antMatchers
(
"/common/download**"
).
anonymous
()
.
antMatchers
(
"/common/download**"
).
anonymous
()
.
antMatchers
(
"/common/download/resource**"
).
anonymous
()
.
antMatchers
(
"/swagger-ui.html"
).
anonymous
()
.
antMatchers
(
"/swagger-ui.html"
).
anonymous
()
.
antMatchers
(
"/swagger-resources/**"
).
anonymous
()
.
antMatchers
(
"/swagger-resources/**"
).
anonymous
()
.
antMatchers
(
"/webjars/**"
).
anonymous
()
.
antMatchers
(
"/webjars/**"
).
anonymous
()
...
...
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
浏览文件 @
2cc14e5f
...
@@ -59,7 +59,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
...
@@ -59,7 +59,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
nowDataMap
.
put
(
REPEAT_PARAMS
,
nowParams
);
nowDataMap
.
put
(
REPEAT_PARAMS
,
nowParams
);
nowDataMap
.
put
(
REPEAT_TIME
,
System
.
currentTimeMillis
());
nowDataMap
.
put
(
REPEAT_TIME
,
System
.
currentTimeMillis
());
// 请求地址(作为存放
session
的key值)
// 请求地址(作为存放
cache
的key值)
String
url
=
request
.
getRequestURI
();
String
url
=
request
.
getRequestURI
();
Object
sessionObj
=
redisCache
.
getCacheObject
(
CACHE_REPEAT_KEY
);
Object
sessionObj
=
redisCache
.
getCacheObject
(
CACHE_REPEAT_KEY
);
...
...
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/framework/task/RyTask.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
framework
.
task
;
import
org.springframework.stereotype.Component
;
import
com.ruoyi.common.utils.StringUtils
;
/**
* 定时任务调度测试
*
* @author ruoyi
*/
@Component
(
"ryTask"
)
public
class
RyTask
{
public
void
ryMultipleParams
(
String
s
,
Boolean
b
,
Long
l
,
Double
d
,
Integer
i
)
{
System
.
out
.
println
(
StringUtils
.
format
(
"执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}"
,
s
,
b
,
l
,
d
,
i
));
}
public
void
ryParams
(
String
params
)
{
System
.
out
.
println
(
"执行有参方法:"
+
params
);
}
public
void
ryNoParams
()
{
System
.
out
.
println
(
"执行无参方法"
);
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/framework/web/domain/Server.java
浏览文件 @
2cc14e5f
...
@@ -28,7 +28,6 @@ import oshi.util.Util;
...
@@ -28,7 +28,6 @@ import oshi.util.Util;
*/
*/
public
class
Server
public
class
Server
{
{
private
static
final
int
OSHI_WAIT_SECOND
=
1000
;
private
static
final
int
OSHI_WAIT_SECOND
=
1000
;
/**
/**
...
...
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java
浏览文件 @
2cc14e5f
...
@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
...
@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.multipart.MultipartFile
;
import
org.springframework.web.multipart.MultipartFile
;
import
com.ruoyi.common.constant.Constants
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.file.FileUploadUtils
;
import
com.ruoyi.common.utils.file.FileUploadUtils
;
import
com.ruoyi.common.utils.file.FileUtils
;
import
com.ruoyi.common.utils.file.FileUtils
;
...
@@ -86,4 +87,23 @@ public class CommonController
...
@@ -86,4 +87,23 @@ public class CommonController
return
AjaxResult
.
error
(
e
.
getMessage
());
return
AjaxResult
.
error
(
e
.
getMessage
());
}
}
}
}
/**
* 本地资源通用下载
*/
@GetMapping
(
"/common/download/resource"
)
public
void
resourceDownload
(
String
name
,
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
Exception
{
// 本地资源路径
String
localPath
=
RuoYiConfig
.
getProfile
();
// 数据库资源地址
String
downloadPath
=
localPath
+
StringUtils
.
substringAfter
(
name
,
Constants
.
RESOURCE_PREFIX
);
// 下载名称
String
downloadName
=
StringUtils
.
substringAfterLast
(
downloadPath
,
"/"
);
response
.
setCharacterEncoding
(
"utf-8"
);
response
.
setContentType
(
"multipart/form-data"
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment;fileName="
+
FileUtils
.
setFileDownloadHeader
(
request
,
downloadName
));
FileUtils
.
writeBytes
(
downloadPath
,
response
.
getOutputStream
());
}
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
controller
;
import
java.util.List
;
import
org.quartz.SchedulerException
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.DeleteMapping
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PutMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.ruoyi.common.exception.job.TaskException
;
import
com.ruoyi.common.utils.poi.ExcelUtil
;
import
com.ruoyi.framework.aspectj.lang.annotation.Log
;
import
com.ruoyi.framework.aspectj.lang.enums.BusinessType
;
import
com.ruoyi.framework.web.controller.BaseController
;
import
com.ruoyi.framework.web.domain.AjaxResult
;
import
com.ruoyi.framework.web.page.TableDataInfo
;
import
com.ruoyi.project.monitor.domain.SysJob
;
import
com.ruoyi.project.monitor.service.ISysJobService
;
/**
* 调度任务信息操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping
(
"/monitor/job"
)
public
class
SysJobController
extends
BaseController
{
@Autowired
private
ISysJobService
jobService
;
/**
* 查询定时任务列表
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:list')"
)
@GetMapping
(
"/list"
)
public
TableDataInfo
list
(
SysJob
sysJob
)
{
startPage
();
List
<
SysJob
>
list
=
jobService
.
selectJobList
(
sysJob
);
return
getDataTable
(
list
);
}
/**
* 导出定时任务列表
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:export')"
)
@Log
(
title
=
"定时任务"
,
businessType
=
BusinessType
.
EXPORT
)
@GetMapping
(
"/export"
)
public
AjaxResult
export
(
SysJob
sysJob
)
{
List
<
SysJob
>
list
=
jobService
.
selectJobList
(
sysJob
);
ExcelUtil
<
SysJob
>
util
=
new
ExcelUtil
<
SysJob
>(
SysJob
.
class
);
return
util
.
exportExcel
(
list
,
"定时任务"
);
}
/**
* 获取定时任务详细信息
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:query')"
)
@GetMapping
(
value
=
"/{jobId}"
)
public
AjaxResult
getInfo
(
@PathVariable
(
"jobId"
)
Long
jobId
)
{
return
AjaxResult
.
success
(
jobService
.
selectJobById
(
jobId
));
}
/**
* 新增定时任务
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:add')"
)
@Log
(
title
=
"定时任务"
,
businessType
=
BusinessType
.
INSERT
)
@PostMapping
public
AjaxResult
add
(
@RequestBody
SysJob
sysJob
)
throws
SchedulerException
,
TaskException
{
return
toAjax
(
jobService
.
insertJob
(
sysJob
));
}
/**
* 修改定时任务
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:edit')"
)
@Log
(
title
=
"定时任务"
,
businessType
=
BusinessType
.
UPDATE
)
@PutMapping
public
AjaxResult
edit
(
@RequestBody
SysJob
sysJob
)
throws
SchedulerException
,
TaskException
{
return
toAjax
(
jobService
.
updateJob
(
sysJob
));
}
/**
* 定时任务状态修改
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:changeStatus')"
)
@Log
(
title
=
"定时任务"
,
businessType
=
BusinessType
.
UPDATE
)
@PutMapping
(
"/changeStatus"
)
public
AjaxResult
changeStatus
(
@RequestBody
SysJob
job
)
throws
SchedulerException
{
SysJob
newJob
=
jobService
.
selectJobById
(
job
.
getJobId
());
newJob
.
setStatus
(
job
.
getStatus
());
return
toAjax
(
jobService
.
changeStatus
(
newJob
));
}
/**
* 定时任务立即执行一次
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:changeStatus')"
)
@Log
(
title
=
"定时任务"
,
businessType
=
BusinessType
.
UPDATE
)
@PutMapping
(
"/run"
)
public
AjaxResult
run
(
@RequestBody
SysJob
job
)
throws
SchedulerException
{
jobService
.
run
(
job
);
return
AjaxResult
.
success
();
}
/**
* 删除定时任务
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:remove')"
)
@Log
(
title
=
"定时任务"
,
businessType
=
BusinessType
.
DELETE
)
@DeleteMapping
(
"/{jobIds}"
)
public
AjaxResult
remove
(
@PathVariable
Long
[]
jobIds
)
throws
SchedulerException
,
TaskException
{
jobService
.
deleteJobByIds
(
jobIds
);
return
AjaxResult
.
success
();
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
controller
;
import
java.util.List
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.DeleteMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.ruoyi.framework.aspectj.lang.annotation.Log
;
import
com.ruoyi.framework.aspectj.lang.enums.BusinessType
;
import
com.ruoyi.project.monitor.domain.SysJobLog
;
import
com.ruoyi.project.monitor.service.ISysJobLogService
;
import
com.ruoyi.framework.web.controller.BaseController
;
import
com.ruoyi.framework.web.domain.AjaxResult
;
import
com.ruoyi.common.utils.poi.ExcelUtil
;
import
com.ruoyi.framework.web.page.TableDataInfo
;
/**
* 调度日志操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping
(
"/monitor/jobLog"
)
public
class
SysJobLogController
extends
BaseController
{
@Autowired
private
ISysJobLogService
jobLogService
;
/**
* 查询定时任务调度日志列表
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:list')"
)
@GetMapping
(
"/list"
)
public
TableDataInfo
list
(
SysJobLog
sysJobLog
)
{
startPage
();
List
<
SysJobLog
>
list
=
jobLogService
.
selectJobLogList
(
sysJobLog
);
return
getDataTable
(
list
);
}
/**
* 导出定时任务调度日志列表
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:export')"
)
@Log
(
title
=
"任务调度日志"
,
businessType
=
BusinessType
.
EXPORT
)
@GetMapping
(
"/export"
)
public
AjaxResult
export
(
SysJobLog
sysJobLog
)
{
List
<
SysJobLog
>
list
=
jobLogService
.
selectJobLogList
(
sysJobLog
);
ExcelUtil
<
SysJobLog
>
util
=
new
ExcelUtil
<
SysJobLog
>(
SysJobLog
.
class
);
return
util
.
exportExcel
(
list
,
"调度日志"
);
}
/**
* 根据调度编号获取详细信息
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:query')"
)
@GetMapping
(
value
=
"/{configId}"
)
public
AjaxResult
getInfo
(
@PathVariable
Long
jobLogId
)
{
return
AjaxResult
.
success
(
jobLogService
.
selectJobLogById
(
jobLogId
));
}
/**
* 删除定时任务调度日志
*/
@PreAuthorize
(
"@ss.hasPermi('monitor:job:remove')"
)
@Log
(
title
=
"定时任务调度日志"
,
businessType
=
BusinessType
.
DELETE
)
@DeleteMapping
(
"/{jobLogIds}"
)
public
AjaxResult
remove
(
@PathVariable
Long
[]
jobLogIds
)
{
return
toAjax
(
jobLogService
.
deleteJobLogByIds
(
jobLogIds
));
}
@PreAuthorize
(
"@ss.hasPermi('monitor:job:remove')"
)
@Log
(
title
=
"调度日志"
,
businessType
=
BusinessType
.
CLEAN
)
@DeleteMapping
(
"/clean"
)
public
AjaxResult
clean
()
{
jobLogService
.
cleanJobLog
();
return
AjaxResult
.
success
();
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysJob.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
domain
;
import
java.io.Serializable
;
import
java.util.Date
;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.Size
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
import
org.apache.commons.lang3.builder.ToStringStyle
;
import
com.ruoyi.common.constant.ScheduleConstants
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.job.CronUtils
;
import
com.ruoyi.framework.aspectj.lang.annotation.Excel
;
import
com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType
;
import
com.ruoyi.framework.web.domain.BaseEntity
;
/**
* 定时任务调度表 sys_job
*
* @author ruoyi
*/
public
class
SysJob
extends
BaseEntity
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/** 任务ID */
@Excel
(
name
=
"任务序号"
,
cellType
=
ColumnType
.
NUMERIC
)
private
Long
jobId
;
/** 任务名称 */
@Excel
(
name
=
"任务名称"
)
private
String
jobName
;
/** 任务组名 */
@Excel
(
name
=
"任务组名"
)
private
String
jobGroup
;
/** 调用目标字符串 */
@Excel
(
name
=
"调用目标字符串"
)
private
String
invokeTarget
;
/** cron执行表达式 */
@Excel
(
name
=
"执行表达式 "
)
private
String
cronExpression
;
/** cron计划策略 */
@Excel
(
name
=
"计划策略 "
,
readConverterExp
=
"0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行"
)
private
String
misfirePolicy
=
ScheduleConstants
.
MISFIRE_DEFAULT
;
/** 是否并发执行(0允许 1禁止) */
@Excel
(
name
=
"并发执行"
,
readConverterExp
=
"0=允许,1=禁止"
)
private
String
concurrent
;
/** 任务状态(0正常 1暂停) */
@Excel
(
name
=
"任务状态"
,
readConverterExp
=
"0=正常,1=暂停"
)
private
String
status
;
public
Long
getJobId
()
{
return
jobId
;
}
public
void
setJobId
(
Long
jobId
)
{
this
.
jobId
=
jobId
;
}
@NotBlank
(
message
=
"任务名称不能为空"
)
@Size
(
min
=
0
,
max
=
64
,
message
=
"任务名称不能超过64个字符"
)
public
String
getJobName
()
{
return
jobName
;
}
public
void
setJobName
(
String
jobName
)
{
this
.
jobName
=
jobName
;
}
public
String
getJobGroup
()
{
return
jobGroup
;
}
public
void
setJobGroup
(
String
jobGroup
)
{
this
.
jobGroup
=
jobGroup
;
}
@NotBlank
(
message
=
"调用目标字符串不能为空"
)
@Size
(
min
=
0
,
max
=
1000
,
message
=
"调用目标字符串长度不能超过500个字符"
)
public
String
getInvokeTarget
()
{
return
invokeTarget
;
}
public
void
setInvokeTarget
(
String
invokeTarget
)
{
this
.
invokeTarget
=
invokeTarget
;
}
@NotBlank
(
message
=
"Cron执行表达式不能为空"
)
@Size
(
min
=
0
,
max
=
255
,
message
=
"Cron执行表达式不能超过255个字符"
)
public
String
getCronExpression
()
{
return
cronExpression
;
}
public
void
setCronExpression
(
String
cronExpression
)
{
this
.
cronExpression
=
cronExpression
;
}
public
Date
getNextValidTime
()
{
if
(
StringUtils
.
isNotEmpty
(
cronExpression
))
{
return
CronUtils
.
getNextExecution
(
cronExpression
);
}
return
null
;
}
public
String
getMisfirePolicy
()
{
return
misfirePolicy
;
}
public
void
setMisfirePolicy
(
String
misfirePolicy
)
{
this
.
misfirePolicy
=
misfirePolicy
;
}
public
String
getConcurrent
()
{
return
concurrent
;
}
public
void
setConcurrent
(
String
concurrent
)
{
this
.
concurrent
=
concurrent
;
}
public
String
getStatus
()
{
return
status
;
}
public
void
setStatus
(
String
status
)
{
this
.
status
=
status
;
}
@Override
public
String
toString
()
{
return
new
ToStringBuilder
(
this
,
ToStringStyle
.
MULTI_LINE_STYLE
)
.
append
(
"jobId"
,
getJobId
())
.
append
(
"jobName"
,
getJobName
())
.
append
(
"jobGroup"
,
getJobGroup
())
.
append
(
"cronExpression"
,
getCronExpression
())
.
append
(
"nextValidTime"
,
getNextValidTime
())
.
append
(
"misfirePolicy"
,
getMisfirePolicy
())
.
append
(
"concurrent"
,
getConcurrent
())
.
append
(
"status"
,
getStatus
())
.
append
(
"createBy"
,
getCreateBy
())
.
append
(
"createTime"
,
getCreateTime
())
.
append
(
"updateBy"
,
getUpdateBy
())
.
append
(
"updateTime"
,
getUpdateTime
())
.
append
(
"remark"
,
getRemark
())
.
toString
();
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysJobLog.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
domain
;
import
java.util.Date
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
import
org.apache.commons.lang3.builder.ToStringStyle
;
import
com.ruoyi.framework.aspectj.lang.annotation.Excel
;
import
com.ruoyi.framework.web.domain.BaseEntity
;
/**
* 定时任务调度日志表 sys_job_log
*
* @author ruoyi
*/
public
class
SysJobLog
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** ID */
@Excel
(
name
=
"日志序号"
)
private
Long
jobLogId
;
/** 任务名称 */
@Excel
(
name
=
"任务名称"
)
private
String
jobName
;
/** 任务组名 */
@Excel
(
name
=
"任务组名"
)
private
String
jobGroup
;
/** 调用目标字符串 */
@Excel
(
name
=
"调用目标字符串"
)
private
String
invokeTarget
;
/** 日志信息 */
@Excel
(
name
=
"日志信息"
)
private
String
jobMessage
;
/** 执行状态(0正常 1失败) */
@Excel
(
name
=
"执行状态"
,
readConverterExp
=
"0=正常,1=失败"
)
private
String
status
;
/** 异常信息 */
@Excel
(
name
=
"异常信息"
)
private
String
exceptionInfo
;
/** 开始时间 */
private
Date
startTime
;
/** 停止时间 */
private
Date
stopTime
;
public
Long
getJobLogId
()
{
return
jobLogId
;
}
public
void
setJobLogId
(
Long
jobLogId
)
{
this
.
jobLogId
=
jobLogId
;
}
public
String
getJobName
()
{
return
jobName
;
}
public
void
setJobName
(
String
jobName
)
{
this
.
jobName
=
jobName
;
}
public
String
getJobGroup
()
{
return
jobGroup
;
}
public
void
setJobGroup
(
String
jobGroup
)
{
this
.
jobGroup
=
jobGroup
;
}
public
String
getInvokeTarget
()
{
return
invokeTarget
;
}
public
void
setInvokeTarget
(
String
invokeTarget
)
{
this
.
invokeTarget
=
invokeTarget
;
}
public
String
getJobMessage
()
{
return
jobMessage
;
}
public
void
setJobMessage
(
String
jobMessage
)
{
this
.
jobMessage
=
jobMessage
;
}
public
String
getStatus
()
{
return
status
;
}
public
void
setStatus
(
String
status
)
{
this
.
status
=
status
;
}
public
String
getExceptionInfo
()
{
return
exceptionInfo
;
}
public
void
setExceptionInfo
(
String
exceptionInfo
)
{
this
.
exceptionInfo
=
exceptionInfo
;
}
public
Date
getStartTime
()
{
return
startTime
;
}
public
void
setStartTime
(
Date
startTime
)
{
this
.
startTime
=
startTime
;
}
public
Date
getStopTime
()
{
return
stopTime
;
}
public
void
setStopTime
(
Date
stopTime
)
{
this
.
stopTime
=
stopTime
;
}
@Override
public
String
toString
()
{
return
new
ToStringBuilder
(
this
,
ToStringStyle
.
MULTI_LINE_STYLE
)
.
append
(
"jobLogId"
,
getJobLogId
())
.
append
(
"jobName"
,
getJobName
())
.
append
(
"jobGroup"
,
getJobGroup
())
.
append
(
"jobMessage"
,
getJobMessage
())
.
append
(
"status"
,
getStatus
())
.
append
(
"exceptionInfo"
,
getExceptionInfo
())
.
append
(
"startTime"
,
getStartTime
())
.
append
(
"stopTime"
,
getStopTime
())
.
toString
();
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysJobLogMapper.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
mapper
;
import
java.util.List
;
import
com.ruoyi.project.monitor.domain.SysJobLog
;
/**
* 调度任务日志信息 数据层
*
* @author ruoyi
*/
public
interface
SysJobLogMapper
{
/**
* 获取quartz调度器日志的计划任务
*
* @param jobLog 调度日志信息
* @return 调度任务日志集合
*/
public
List
<
SysJobLog
>
selectJobLogList
(
SysJobLog
jobLog
);
/**
* 查询所有调度任务日志
*
* @return 调度任务日志列表
*/
public
List
<
SysJobLog
>
selectJobLogAll
();
/**
* 通过调度任务日志ID查询调度信息
*
* @param jobLogId 调度任务日志ID
* @return 调度任务日志对象信息
*/
public
SysJobLog
selectJobLogById
(
Long
jobLogId
);
/**
* 新增任务日志
*
* @param jobLog 调度日志信息
* @return 结果
*/
public
int
insertJobLog
(
SysJobLog
jobLog
);
/**
* 批量删除调度日志信息
*
* @param logIds 需要删除的数据ID
* @return 结果
*/
public
int
deleteJobLogByIds
(
Long
[]
logIds
);
/**
* 删除任务日志
*
* @param jobId 调度日志ID
* @return 结果
*/
public
int
deleteJobLogById
(
Long
jobId
);
/**
* 清空任务日志
*/
public
void
cleanJobLog
();
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysJobMapper.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
mapper
;
import
java.util.List
;
import
com.ruoyi.project.monitor.domain.SysJob
;
/**
* 调度任务信息 数据层
*
* @author ruoyi
*/
public
interface
SysJobMapper
{
/**
* 查询调度任务日志集合
*
* @param job 调度信息
* @return 操作日志集合
*/
public
List
<
SysJob
>
selectJobList
(
SysJob
job
);
/**
* 查询所有调度任务
*
* @return 调度任务列表
*/
public
List
<
SysJob
>
selectJobAll
();
/**
* 通过调度ID查询调度任务信息
*
* @param jobId 调度ID
* @return 角色对象信息
*/
public
SysJob
selectJobById
(
Long
jobId
);
/**
* 通过调度ID删除调度任务信息
*
* @param jobId 调度ID
* @return 结果
*/
public
int
deleteJobById
(
Long
jobId
);
/**
* 批量删除调度任务信息
*
* @param ids 需要删除的数据ID
* @return 结果
*/
public
int
deleteJobByIds
(
Long
[]
ids
);
/**
* 修改调度任务信息
*
* @param job 调度任务信息
* @return 结果
*/
public
int
updateJob
(
SysJob
job
);
/**
* 新增调度任务信息
*
* @param job 调度任务信息
* @return 结果
*/
public
int
insertJob
(
SysJob
job
);
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysJobLogService.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
service
;
import
java.util.List
;
import
com.ruoyi.project.monitor.domain.SysJobLog
;
/**
* 定时任务调度日志信息信息 服务层
*
* @author ruoyi
*/
public
interface
ISysJobLogService
{
/**
* 获取quartz调度器日志的计划任务
*
* @param jobLog 调度日志信息
* @return 调度任务日志集合
*/
public
List
<
SysJobLog
>
selectJobLogList
(
SysJobLog
jobLog
);
/**
* 通过调度任务日志ID查询调度信息
*
* @param jobLogId 调度任务日志ID
* @return 调度任务日志对象信息
*/
public
SysJobLog
selectJobLogById
(
Long
jobLogId
);
/**
* 新增任务日志
*
* @param jobLog 调度日志信息
*/
public
void
addJobLog
(
SysJobLog
jobLog
);
/**
* 批量删除调度日志信息
*
* @param logIds 需要删除的日志ID
* @return 结果
*/
public
int
deleteJobLogByIds
(
Long
[]
logIds
);
/**
* 删除任务日志
*
* @param jobId 调度日志ID
* @return 结果
*/
public
int
deleteJobLogById
(
Long
jobId
);
/**
* 清空任务日志
*/
public
void
cleanJobLog
();
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysJobService.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
service
;
import
java.util.List
;
import
org.quartz.SchedulerException
;
import
com.ruoyi.common.exception.job.TaskException
;
import
com.ruoyi.project.monitor.domain.SysJob
;
/**
* 定时任务调度信息信息 服务层
*
* @author ruoyi
*/
public
interface
ISysJobService
{
/**
* 获取quartz调度器的计划任务
*
* @param job 调度信息
* @return 调度任务集合
*/
public
List
<
SysJob
>
selectJobList
(
SysJob
job
);
/**
* 通过调度任务ID查询调度信息
*
* @param jobId 调度任务ID
* @return 调度任务对象信息
*/
public
SysJob
selectJobById
(
Long
jobId
);
/**
* 暂停任务
*
* @param job 调度信息
* @return 结果
*/
public
int
pauseJob
(
SysJob
job
)
throws
SchedulerException
;
/**
* 恢复任务
*
* @param job 调度信息
* @return 结果
*/
public
int
resumeJob
(
SysJob
job
)
throws
SchedulerException
;
/**
* 删除任务后,所对应的trigger也将被删除
*
* @param job 调度信息
* @return 结果
*/
public
int
deleteJob
(
SysJob
job
)
throws
SchedulerException
;
/**
* 批量删除调度信息
*
* @param jobIds 需要删除的任务ID
* @return 结果
*/
public
void
deleteJobByIds
(
Long
[]
jobIds
)
throws
SchedulerException
;
/**
* 任务调度状态修改
*
* @param job 调度信息
* @return 结果
*/
public
int
changeStatus
(
SysJob
job
)
throws
SchedulerException
;
/**
* 立即运行任务
*
* @param job 调度信息
* @return 结果
*/
public
void
run
(
SysJob
job
)
throws
SchedulerException
;
/**
* 新增任务
*
* @param job 调度信息
* @return 结果
*/
public
int
insertJob
(
SysJob
job
)
throws
SchedulerException
,
TaskException
;
/**
* 更新任务
*
* @param job 调度信息
* @return 结果
*/
public
int
updateJob
(
SysJob
job
)
throws
SchedulerException
,
TaskException
;
/**
* 校验cron表达式是否有效
*
* @param cronExpression 表达式
* @return 结果
*/
public
boolean
checkCronExpressionIsValid
(
String
cronExpression
);
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysJobLogServiceImpl.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
service
.
impl
;
import
java.util.List
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.ruoyi.project.monitor.domain.SysJobLog
;
import
com.ruoyi.project.monitor.mapper.SysJobLogMapper
;
import
com.ruoyi.project.monitor.service.ISysJobLogService
;
/**
* 定时任务调度日志信息 服务层
*
* @author ruoyi
*/
@Service
public
class
SysJobLogServiceImpl
implements
ISysJobLogService
{
@Autowired
private
SysJobLogMapper
jobLogMapper
;
/**
* 获取quartz调度器日志的计划任务
*
* @param jobLog 调度日志信息
* @return 调度任务日志集合
*/
@Override
public
List
<
SysJobLog
>
selectJobLogList
(
SysJobLog
jobLog
)
{
return
jobLogMapper
.
selectJobLogList
(
jobLog
);
}
/**
* 通过调度任务日志ID查询调度信息
*
* @param jobLogId 调度任务日志ID
* @return 调度任务日志对象信息
*/
@Override
public
SysJobLog
selectJobLogById
(
Long
jobLogId
)
{
return
jobLogMapper
.
selectJobLogById
(
jobLogId
);
}
/**
* 新增任务日志
*
* @param jobLog 调度日志信息
*/
@Override
public
void
addJobLog
(
SysJobLog
jobLog
)
{
jobLogMapper
.
insertJobLog
(
jobLog
);
}
/**
* 批量删除调度日志信息
*
* @param logIds 需要删除的数据ID
* @return 结果
*/
@Override
public
int
deleteJobLogByIds
(
Long
[]
logIds
)
{
return
jobLogMapper
.
deleteJobLogByIds
(
logIds
);
}
/**
* 删除任务日志
*
* @param jobId 调度日志ID
*/
@Override
public
int
deleteJobLogById
(
Long
jobId
)
{
return
jobLogMapper
.
deleteJobLogById
(
jobId
);
}
/**
* 清空任务日志
*/
@Override
public
void
cleanJobLog
()
{
jobLogMapper
.
cleanJobLog
();
}
}
This diff is collapsed.
Click to expand it.
ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
0 → 100644
浏览文件 @
2cc14e5f
package
com
.
ruoyi
.
project
.
monitor
.
service
.
impl
;
import
java.util.List
;
import
javax.annotation.PostConstruct
;
import
org.quartz.JobDataMap
;
import
org.quartz.JobKey
;
import
org.quartz.Scheduler
;
import
org.quartz.SchedulerException
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
com.ruoyi.common.constant.ScheduleConstants
;
import
com.ruoyi.common.exception.job.TaskException
;
import
com.ruoyi.common.utils.job.CronUtils
;
import
com.ruoyi.common.utils.job.ScheduleUtils
;
import
com.ruoyi.project.monitor.domain.SysJob
;
import
com.ruoyi.project.monitor.mapper.SysJobMapper
;
import
com.ruoyi.project.monitor.service.ISysJobService
;
/**
* 定时任务调度信息 服务层
*
* @author ruoyi
*/
@Service
public
class
SysJobServiceImpl
implements
ISysJobService
{
@Autowired
private
Scheduler
scheduler
;
@Autowired
private
SysJobMapper
jobMapper
;
/**
* 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据)
*/
@PostConstruct
public
void
init
()
throws
SchedulerException
,
TaskException
{
scheduler
.
clear
();
List
<
SysJob
>
jobList
=
jobMapper
.
selectJobAll
();
for
(
SysJob
job
:
jobList
)
{
ScheduleUtils
.
createScheduleJob
(
scheduler
,
job
);
}
}
/**
* 获取quartz调度器的计划任务列表
*
* @param job 调度信息
* @return
*/
@Override
public
List
<
SysJob
>
selectJobList
(
SysJob
job
)
{
return
jobMapper
.
selectJobList
(
job
);
}
/**
* 通过调度任务ID查询调度信息
*
* @param jobId 调度任务ID
* @return 调度任务对象信息
*/
@Override
public
SysJob
selectJobById
(
Long
jobId
)
{
return
jobMapper
.
selectJobById
(
jobId
);
}
/**
* 暂停任务
*
* @param job 调度信息
*/
@Override
@Transactional
public
int
pauseJob
(
SysJob
job
)
throws
SchedulerException
{
Long
jobId
=
job
.
getJobId
();
String
jobGroup
=
job
.
getJobGroup
();
job
.
setStatus
(
ScheduleConstants
.
Status
.
PAUSE
.
getValue
());
int
rows
=
jobMapper
.
updateJob
(
job
);
if
(
rows
>
0
)
{
scheduler
.
pauseJob
(
ScheduleUtils
.
getJobKey
(
jobId
,
jobGroup
));
}
return
rows
;
}
/**
* 恢复任务
*
* @param job 调度信息
*/
@Override
@Transactional
public
int
resumeJob
(
SysJob
job
)
throws
SchedulerException
{
Long
jobId
=
job
.
getJobId
();
String
jobGroup
=
job
.
getJobGroup
();
job
.
setStatus
(
ScheduleConstants
.
Status
.
NORMAL
.
getValue
());
int
rows
=
jobMapper
.
updateJob
(
job
);
if
(
rows
>
0
)
{
scheduler
.
resumeJob
(
ScheduleUtils
.
getJobKey
(
jobId
,
jobGroup
));
}
return
rows
;
}
/**
* 删除任务后,所对应的trigger也将被删除
*
* @param job 调度信息
*/
@Override
@Transactional
public
int
deleteJob
(
SysJob
job
)
throws
SchedulerException
{
Long
jobId
=
job
.
getJobId
();
String
jobGroup
=
job
.
getJobGroup
();
int
rows
=
jobMapper
.
deleteJobById
(
jobId
);
if
(
rows
>
0
)
{
scheduler
.
deleteJob
(
ScheduleUtils
.
getJobKey
(
jobId
,
jobGroup
));
}
return
rows
;
}
/**
* 批量删除调度信息
*
* @param jobIds 需要删除的任务ID
* @return 结果
*/
@Override
@Transactional
public
void
deleteJobByIds
(
Long
[]
jobIds
)
throws
SchedulerException
{
for
(
Long
jobId
:
jobIds
)
{
SysJob
job
=
jobMapper
.
selectJobById
(
jobId
);
deleteJob
(
job
);
}
}
/**
* 任务调度状态修改
*
* @param job 调度信息
*/
@Override
@Transactional
public
int
changeStatus
(
SysJob
job
)
throws
SchedulerException
{
int
rows
=
0
;
String
status
=
job
.
getStatus
();
if
(
ScheduleConstants
.
Status
.
NORMAL
.
getValue
().
equals
(
status
))
{
rows
=
resumeJob
(
job
);
}
else
if
(
ScheduleConstants
.
Status
.
PAUSE
.
getValue
().
equals
(
status
))
{
rows
=
pauseJob
(
job
);
}
return
rows
;
}
/**
* 立即运行任务
*
* @param job 调度信息
*/
@Override
@Transactional
public
void
run
(
SysJob
job
)
throws
SchedulerException
{
Long
jobId
=
job
.
getJobId
();
String
jobGroup
=
job
.
getJobGroup
();
SysJob
properties
=
selectJobById
(
job
.
getJobId
());
// 参数
JobDataMap
dataMap
=
new
JobDataMap
();
dataMap
.
put
(
ScheduleConstants
.
TASK_PROPERTIES
,
properties
);
scheduler
.
triggerJob
(
ScheduleUtils
.
getJobKey
(
jobId
,
jobGroup
),
dataMap
);
}
/**
* 新增任务
*
* @param job 调度信息 调度信息
*/
@Override
@Transactional
public
int
insertJob
(
SysJob
job
)
throws
SchedulerException
,
TaskException
{
job
.
setStatus
(
ScheduleConstants
.
Status
.
PAUSE
.
getValue
());
int
rows
=
jobMapper
.
insertJob
(
job
);
if
(
rows
>
0
)
{
ScheduleUtils
.
createScheduleJob
(
scheduler
,
job
);
}
return
rows
;
}
/**
* 更新任务的时间表达式
*
* @param job 调度信息
*/
@Override
@Transactional
public
int
updateJob
(
SysJob
job
)
throws
SchedulerException
,
TaskException
{
SysJob
properties
=
selectJobById
(
job
.
getJobId
());
int
rows
=
jobMapper
.
updateJob
(
job
);
if
(
rows
>
0
)
{
updateSchedulerJob
(
job
,
properties
.
getJobGroup
());
}
return
rows
;
}
/**
* 更新任务
*
* @param job 任务对象
* @param jobGroup 任务组名
*/
public
void
updateSchedulerJob
(
SysJob
job
,
String
jobGroup
)
throws
SchedulerException
,
TaskException
{
Long
jobId
=
job
.
getJobId
();
// 判断是否存在
JobKey
jobKey
=
ScheduleUtils
.
getJobKey
(
jobId
,
jobGroup
);
if
(
scheduler
.
checkExists
(
jobKey
))
{
// 防止创建时存在数据问题 先移除,然后在执行创建操作
scheduler
.
deleteJob
(
jobKey
);
}
ScheduleUtils
.
createScheduleJob
(
scheduler
,
job
);
}
/**
* 校验cron表达式是否有效
*
* @param cronExpression 表达式
* @return 结果
*/
@Override
public
boolean
checkCronExpressionIsValid
(
String
cronExpression
)
{
return
CronUtils
.
isValid
(
cronExpression
);
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/resources/application.yml
浏览文件 @
2cc14e5f
...
@@ -3,7 +3,7 @@ ruoyi:
...
@@ -3,7 +3,7 @@ ruoyi:
# 名称
# 名称
name
:
RuoYi
name
:
RuoYi
# 版本
# 版本
version
:
2.
1
.0
version
:
2.
2
.0
# 版权年份
# 版权年份
copyrightYear
:
2019
copyrightYear
:
2019
# 实例演示开关
# 实例演示开关
...
@@ -28,7 +28,6 @@ server:
...
@@ -28,7 +28,6 @@ server:
# Tomcat启动初始化的线程数,默认值25
# Tomcat启动初始化的线程数,默认值25
min-spare-threads
:
30
min-spare-threads
:
30
# 日志配置
# 日志配置
logging
:
logging
:
level
:
level
:
...
...
This diff is collapsed.
Click to expand it.
ruoyi/src/main/resources/mybatis/system/SysJobLogMapper.xml
0 → 100644
浏览文件 @
2cc14e5f
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.ruoyi.project.monitor.mapper.SysJobLogMapper"
>
<resultMap
type=
"SysJobLog"
id=
"SysJobLogResult"
>
<id
property=
"jobLogId"
column=
"job_log_id"
/>
<result
property=
"jobName"
column=
"job_name"
/>
<result
property=
"jobGroup"
column=
"job_group"
/>
<result
property=
"invokeTarget"
column=
"invoke_target"
/>
<result
property=
"jobMessage"
column=
"job_message"
/>
<result
property=
"status"
column=
"status"
/>
<result
property=
"exceptionInfo"
column=
"exception_info"
/>
<result
property=
"createTime"
column=
"create_time"
/>
</resultMap>
<sql
id=
"selectJobLogVo"
>
select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time
from sys_job_log
</sql>
<select
id=
"selectJobLogList"
parameterType=
"SysJobLog"
resultMap=
"SysJobLogResult"
>
<include
refid=
"selectJobLogVo"
/>
<where>
<if
test=
"jobName != null and jobName != ''"
>
AND job_name like concat('%', #{jobName}, '%')
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
AND job_group = #{jobGroup}
</if>
<if
test=
"status != null and status != ''"
>
AND status = #{status}
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
AND invoke_target like concat('%', #{invokeTarget}, '%')
</if>
<if
test=
"beginTime != null and beginTime != ''"
>
<!-- 开始时间检索 -->
and date_format(create_time,'%y%m%d')
>
= date_format(#{beginTime},'%y%m%d')
</if>
<if
test=
"endTime != null and endTime != ''"
>
<!-- 结束时间检索 -->
and date_format(create_time,'%y%m%d')
<
= date_format(#{endTime},'%y%m%d')
</if>
</where>
</select>
<select
id=
"selectJobLogAll"
resultMap=
"SysJobLogResult"
>
<include
refid=
"selectJobLogVo"
/>
</select>
<select
id=
"selectJobLogById"
parameterType=
"Long"
resultMap=
"SysJobLogResult"
>
<include
refid=
"selectJobLogVo"
/>
where job_log_id = #{jobLogId}
</select>
<delete
id=
"deleteJobLogById"
parameterType=
"Long"
>
delete from sys_job_log where job_log_id = #{jobLogId}
</delete>
<delete
id=
"deleteJobLogByIds"
parameterType=
"Long"
>
delete from sys_job_log where job_log_id in
<foreach
collection=
"array"
item=
"jobLogId"
open=
"("
separator=
","
close=
")"
>
#{jobLogId}
</foreach>
</delete>
<update
id=
"cleanJobLog"
>
truncate table sys_job_log
</update>
<insert
id=
"insertJobLog"
parameterType=
"SysJobLog"
>
insert into sys_job_log(
<if
test=
"jobLogId != null and jobLogId != 0"
>
job_log_id,
</if>
<if
test=
"jobName != null and jobName != ''"
>
job_name,
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
job_group,
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
invoke_target,
</if>
<if
test=
"jobMessage != null and jobMessage != ''"
>
job_message,
</if>
<if
test=
"status != null and status != ''"
>
status,
</if>
<if
test=
"exceptionInfo != null and exceptionInfo != ''"
>
exception_info,
</if>
create_time
)values(
<if
test=
"jobLogId != null and jobLogId != 0"
>
#{jobLogId},
</if>
<if
test=
"jobName != null and jobName != ''"
>
#{jobName},
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
#{jobGroup},
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
#{invokeTarget},
</if>
<if
test=
"jobMessage != null and jobMessage != ''"
>
#{jobMessage},
</if>
<if
test=
"status != null and status != ''"
>
#{status},
</if>
<if
test=
"exceptionInfo != null and exceptionInfo != ''"
>
#{exceptionInfo},
</if>
sysdate()
)
</insert>
</mapper>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
ruoyi/src/main/resources/mybatis/system/SysJobMapper.xml
0 → 100644
浏览文件 @
2cc14e5f
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.ruoyi.project.monitor.mapper.SysJobMapper"
>
<resultMap
type=
"SysJob"
id=
"SysJobResult"
>
<id
property=
"jobId"
column=
"job_id"
/>
<result
property=
"jobName"
column=
"job_name"
/>
<result
property=
"jobGroup"
column=
"job_group"
/>
<result
property=
"invokeTarget"
column=
"invoke_target"
/>
<result
property=
"cronExpression"
column=
"cron_expression"
/>
<result
property=
"misfirePolicy"
column=
"misfire_policy"
/>
<result
property=
"concurrent"
column=
"concurrent"
/>
<result
property=
"status"
column=
"status"
/>
<result
property=
"createBy"
column=
"create_by"
/>
<result
property=
"createTime"
column=
"create_time"
/>
<result
property=
"updateBy"
column=
"update_by"
/>
<result
property=
"updateTime"
column=
"update_time"
/>
<result
property=
"remark"
column=
"remark"
/>
</resultMap>
<sql
id=
"selectJobVo"
>
select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark
from sys_job
</sql>
<select
id=
"selectJobList"
parameterType=
"SysJob"
resultMap=
"SysJobResult"
>
<include
refid=
"selectJobVo"
/>
<where>
<if
test=
"jobName != null and jobName != ''"
>
AND job_name like concat('%', #{jobName}, '%')
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
AND job_group = #{jobGroup}
</if>
<if
test=
"status != null and status != ''"
>
AND status = #{status}
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
AND invoke_target like concat('%', #{invokeTarget}, '%')
</if>
</where>
</select>
<select
id=
"selectJobAll"
resultMap=
"SysJobResult"
>
<include
refid=
"selectJobVo"
/>
</select>
<select
id=
"selectJobById"
parameterType=
"Long"
resultMap=
"SysJobResult"
>
<include
refid=
"selectJobVo"
/>
where job_id = #{jobId}
</select>
<delete
id=
"deleteJobById"
parameterType=
"Long"
>
delete from sys_job where job_id = #{jobId}
</delete>
<delete
id=
"deleteJobByIds"
parameterType=
"Long"
>
delete from sys_job where job_id in
<foreach
collection=
"array"
item=
"jobId"
open=
"("
separator=
","
close=
")"
>
#{jobId}
</foreach>
</delete>
<update
id=
"updateJob"
parameterType=
"SysJob"
>
update sys_job
<set>
<if
test=
"jobName != null and jobName != ''"
>
job_name = #{jobName},
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
job_group = #{jobGroup},
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
invoke_target = #{invokeTarget},
</if>
<if
test=
"cronExpression != null and cronExpression != ''"
>
cron_expression = #{cronExpression},
</if>
<if
test=
"misfirePolicy != null and misfirePolicy != ''"
>
misfire_policy = #{misfirePolicy},
</if>
<if
test=
"concurrent != null and concurrent != ''"
>
concurrent = #{concurrent},
</if>
<if
test=
"status !=null"
>
status = #{status},
</if>
<if
test=
"remark != null and remark != ''"
>
remark = #{remark},
</if>
<if
test=
"updateBy != null and updateBy != ''"
>
update_by = #{updateBy},
</if>
update_time = sysdate()
</set>
where job_id = #{jobId}
</update>
<insert
id=
"insertJob"
parameterType=
"SysJob"
useGeneratedKeys=
"true"
keyProperty=
"jobId"
>
insert into sys_job(
<if
test=
"jobId != null and jobId != 0"
>
job_id,
</if>
<if
test=
"jobName != null and jobName != ''"
>
job_name,
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
job_group,
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
invoke_target,
</if>
<if
test=
"cronExpression != null and cronExpression != ''"
>
cron_expression,
</if>
<if
test=
"misfirePolicy != null and misfirePolicy != ''"
>
misfire_policy,
</if>
<if
test=
"concurrent != null and concurrent != ''"
>
concurrent,
</if>
<if
test=
"status != null and status != ''"
>
status,
</if>
<if
test=
"remark != null and remark != ''"
>
remark,
</if>
<if
test=
"createBy != null and createBy != ''"
>
create_by,
</if>
create_time
)values(
<if
test=
"jobId != null and jobId != 0"
>
#{jobId},
</if>
<if
test=
"jobName != null and jobName != ''"
>
#{jobName},
</if>
<if
test=
"jobGroup != null and jobGroup != ''"
>
#{jobGroup},
</if>
<if
test=
"invokeTarget != null and invokeTarget != ''"
>
#{invokeTarget},
</if>
<if
test=
"cronExpression != null and cronExpression != ''"
>
#{cronExpression},
</if>
<if
test=
"misfirePolicy != null and misfirePolicy != ''"
>
#{misfirePolicy},
</if>
<if
test=
"concurrent != null and concurrent != ''"
>
#{concurrent},
</if>
<if
test=
"status != null and status != ''"
>
#{status},
</if>
<if
test=
"remark != null and remark != ''"
>
#{remark},
</if>
<if
test=
"createBy != null and createBy != ''"
>
#{createBy},
</if>
sysdate()
)
</insert>
</mapper>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论