Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
finance-manage
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
finance-oa
finance-manage
Commits
2cc14e5f
Commit
2cc14e5f
authored
Mar 18, 2020
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
若依 2.2
parent
505ee1d6
Changes
42
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
42 changed files
with
3325 additions
and
25 deletions
+3325
-25
ruoyi-ui/package.json
ruoyi-ui/package.json
+1
-1
ruoyi-ui/src/api/monitor/job.js
ruoyi-ui/src/api/monitor/job.js
+80
-0
ruoyi-ui/src/api/monitor/jobLog.js
ruoyi-ui/src/api/monitor/jobLog.js
+35
-0
ruoyi-ui/src/components/SvgIcon/index.vue
ruoyi-ui/src/components/SvgIcon/index.vue
+1
-1
ruoyi-ui/src/layout/components/TagsView/index.vue
ruoyi-ui/src/layout/components/TagsView/index.vue
+1
-1
ruoyi-ui/src/router/index.js
ruoyi-ui/src/router/index.js
+13
-0
ruoyi-ui/src/store/modules/tagsView.js
ruoyi-ui/src/store/modules/tagsView.js
+6
-13
ruoyi-ui/src/views/monitor/job/index.vue
ruoyi-ui/src/views/monitor/job/index.vue
+485
-2
ruoyi-ui/src/views/monitor/job/log.vue
ruoyi-ui/src/views/monitor/job/log.vue
+295
-0
ruoyi/pom.xml
ruoyi/pom.xml
+14
-1
ruoyi/sql/quartz.sql
ruoyi/sql/quartz.sql
+170
-0
ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java
ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java
+1
-1
ruoyi/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java
...ain/java/com/ruoyi/common/constant/ScheduleConstants.java
+50
-0
ruoyi/src/main/java/com/ruoyi/common/exception/job/TaskException.java
...in/java/com/ruoyi/common/exception/job/TaskException.java
+34
-0
ruoyi/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java
...i/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java
+40
-0
ruoyi/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java
.../src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java
+110
-0
ruoyi/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
...src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
+0
-1
ruoyi/src/main/java/com/ruoyi/common/utils/job/AbstractQuartzJob.java
...in/java/com/ruoyi/common/utils/job/AbstractQuartzJob.java
+107
-0
ruoyi/src/main/java/com/ruoyi/common/utils/job/CronUtils.java
...i/src/main/java/com/ruoyi/common/utils/job/CronUtils.java
+63
-0
ruoyi/src/main/java/com/ruoyi/common/utils/job/JobInvokeUtil.java
...c/main/java/com/ruoyi/common/utils/job/JobInvokeUtil.java
+182
-0
ruoyi/src/main/java/com/ruoyi/common/utils/job/QuartzDisallowConcurrentExecution.java
...i/common/utils/job/QuartzDisallowConcurrentExecution.java
+21
-0
ruoyi/src/main/java/com/ruoyi/common/utils/job/QuartzJobExecution.java
...n/java/com/ruoyi/common/utils/job/QuartzJobExecution.java
+19
-0
ruoyi/src/main/java/com/ruoyi/common/utils/job/ScheduleUtils.java
...c/main/java/com/ruoyi/common/utils/job/ScheduleUtils.java
+113
-0
ruoyi/src/main/java/com/ruoyi/framework/config/ScheduleConfig.java
.../main/java/com/ruoyi/framework/config/ScheduleConfig.java
+57
-0
ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
.../main/java/com/ruoyi/framework/config/SecurityConfig.java
+1
-0
ruoyi/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
...yi/framework/interceptor/impl/SameUrlDataInterceptor.java
+1
-1
ruoyi/src/main/java/com/ruoyi/framework/task/RyTask.java
ruoyi/src/main/java/com/ruoyi/framework/task/RyTask.java
+28
-0
ruoyi/src/main/java/com/ruoyi/framework/web/domain/Server.java
.../src/main/java/com/ruoyi/framework/web/domain/Server.java
+0
-1
ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java
.../main/java/com/ruoyi/project/common/CommonController.java
+20
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java
...om/ruoyi/project/monitor/controller/SysJobController.java
+130
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java
...ruoyi/project/monitor/controller/SysJobLogController.java
+87
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysJob.java
...rc/main/java/com/ruoyi/project/monitor/domain/SysJob.java
+170
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysJobLog.java
...main/java/com/ruoyi/project/monitor/domain/SysJobLog.java
+155
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysJobLogMapper.java
...ava/com/ruoyi/project/monitor/mapper/SysJobLogMapper.java
+64
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysJobMapper.java
...n/java/com/ruoyi/project/monitor/mapper/SysJobMapper.java
+67
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysJobLogService.java
.../com/ruoyi/project/monitor/service/ISysJobLogService.java
+56
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysJobService.java
...ava/com/ruoyi/project/monitor/service/ISysJobService.java
+102
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysJobLogServiceImpl.java
...yi/project/monitor/service/impl/SysJobLogServiceImpl.java
+87
-0
ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
...ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
+254
-0
ruoyi/src/main/resources/application.yml
ruoyi/src/main/resources/application.yml
+1
-2
ruoyi/src/main/resources/mybatis/system/SysJobLogMapper.xml
ruoyi/src/main/resources/mybatis/system/SysJobLogMapper.xml
+93
-0
ruoyi/src/main/resources/mybatis/system/SysJobMapper.xml
ruoyi/src/main/resources/mybatis/system/SysJobMapper.xml
+111
-0
No files found.
ruoyi-ui/package.json
View file @
2cc14e5f
{
"name"
:
"ruoyi"
,
"version"
:
"2.
1
.0"
,
"version"
:
"2.
2
.0"
,
"description"
:
"若依管理系统"
,
"author"
:
"若依"
,
"license"
:
"MIT"
,
...
...
ruoyi-ui/src/api/monitor/job.js
0 → 100644
View file @
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
ruoyi-ui/src/api/monitor/jobLog.js
0 → 100644
View file @
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
ruoyi-ui/src/components/SvgIcon/index.vue
View file @
2cc14e5f
<
template
>
<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"
>
<use
:
xlink:
href=
"iconName"
/>
<use
:href=
"iconName"
/>
</svg>
</
template
>
...
...
ruoyi-ui/src/layout/components/TagsView/index.vue
View file @
2cc14e5f
...
...
@@ -158,7 +158,7 @@ export default {
toLastView
(
visitedViews
,
view
)
{
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
if
(
latestView
)
{
this
.
$router
.
push
(
latestView
)
this
.
$router
.
push
(
latestView
.
fullPath
)
}
else
{
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
...
...
ruoyi-ui/src/router/index.js
View file @
2cc14e5f
...
...
@@ -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
'
,
component
:
Layout
,
...
...
ruoyi-ui/src/store/modules/tagsView.js
View file @
2cc14e5f
...
...
@@ -28,13 +28,8 @@ const mutations = {
}
},
DEL_CACHED_VIEW
:
(
state
,
view
)
=>
{
for
(
const
i
of
state
.
cachedViews
)
{
if
(
i
===
view
.
name
)
{
const
index
=
state
.
cachedViews
.
indexOf
(
i
)
state
.
cachedViews
.
splice
(
index
,
1
)
break
}
}
const
index
=
state
.
cachedViews
.
indexOf
(
view
.
name
)
index
>
-
1
&&
state
.
cachedViews
.
splice
(
index
,
1
)
},
DEL_OTHERS_VISITED_VIEWS
:
(
state
,
view
)
=>
{
...
...
@@ -43,12 +38,10 @@ const mutations = {
})
},
DEL_OTHERS_CACHED_VIEWS
:
(
state
,
view
)
=>
{
for
(
const
i
of
state
.
cachedViews
)
{
if
(
i
===
view
.
name
)
{
const
index
=
state
.
cachedViews
.
indexOf
(
i
)
state
.
cachedViews
=
state
.
cachedViews
.
slice
(
index
,
index
+
1
)
break
}
if
(
index
>
-
1
)
{
state
.
cachedViews
=
state
.
cachedViews
.
slice
(
index
,
index
+
1
)
}
else
{
state
.
cachedViews
=
[]
}
},
...
...
ruoyi-ui/src/views/monitor/job/index.vue
View file @
2cc14e5f
This diff is collapsed.
Click to expand it.
ruoyi-ui/src/views/monitor/job/log.vue
0 → 100644
View file @
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
ruoyi/pom.xml
View file @
2cc14e5f
...
...
@@ -5,7 +5,7 @@
<groupId>
com.ruoyi
</groupId>
<artifactId>
ruoyi
</artifactId>
<version>
2.
1
.0
</version>
<version>
2.
2
.0
</version>
<packaging>
jar
</packaging>
<name>
ruoyi
</name>
...
...
@@ -224,12 +224,25 @@
<artifactId>
poi-ooxml
</artifactId>
<version>
${poi.version}
</version>
</dependency>
<!--velocity代码生成使用模板 -->
<dependency>
<groupId>
org.apache.velocity
</groupId>
<artifactId>
velocity
</artifactId>
<version>
${velocity.version}
</version>
</dependency>
<!-- 定时任务 -->
<dependency>
<groupId>
org.quartz-scheduler
</groupId>
<artifactId>
quartz
</artifactId>
<exclusions>
<exclusion>
<groupId>
com.mchange
</groupId>
<artifactId>
c3p0
</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
...
...
ruoyi/sql/quartz.sql
0 → 100644
View file @
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
ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java
View file @
2cc14e5f
...
...
@@ -14,7 +14,7 @@ public class RuoYiApplication
{
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
);
System
.
out
.
println
(
"(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n"
+
" .-------. ____ __ \n"
+
...
...
ruoyi/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java
0 → 100644
View file @
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
;
}
}
}
ruoyi/src/main/java/com/ruoyi/common/exception/job/TaskException.java
0 → 100644
View file @
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
ruoyi/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java
0 → 100644
View file @
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
);
}
}
ruoyi/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java
0 → 100644
View file @
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
));
}
}
ruoyi/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
View file @
2cc14e5f
...
...
@@ -21,7 +21,6 @@ public class HttpHelper
public
static
String
getBodyString
(
ServletRequest
request
)
{
StringBuilder
sb
=
new
StringBuilder
();
BufferedReader
reader
=
null
;
try
(
InputStream
inputStream
=
request
.
getInputStream
())
...
...
ruoyi/src/main/java/com/ruoyi/common/utils/job/AbstractQuartzJob.java
0 → 100644
View file @
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
;
}
ruoyi/src/main/java/com/ruoyi/common/utils/job/CronUtils.java
0 → 100644
View file @
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
());
}
}
}
ruoyi/src/main/java/com/ruoyi/common/utils/job/JobInvokeUtil.java
0 → 100644
View file @
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
;
}
}
ruoyi/src/main/java/com/ruoyi/common/utils/job/QuartzDisallowConcurrentExecution.java
0 → 100644
View file @
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
);
}
}
ruoyi/src/main/java/com/ruoyi/common/utils/job/QuartzJobExecution.java
0 → 100644
View file @
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
);
}
}
ruoyi/src/main/java/com/ruoyi/common/utils/job/ScheduleUtils.java
0 → 100644
View file @
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
ruoyi/src/main/java/com/ruoyi/framework/config/ScheduleConfig.java
0 → 100644
View file @
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
;
}
}
ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
View file @
2cc14e5f
...
...
@@ -99,6 +99,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
).
permitAll
()
.
antMatchers
(
"/profile/**"
).
anonymous
()
.
antMatchers
(
"/common/download**"
).
anonymous
()
.
antMatchers
(
"/common/download/resource**"
).
anonymous
()
.
antMatchers
(
"/swagger-ui.html"
).
anonymous
()
.
antMatchers
(
"/swagger-resources/**"
).
anonymous
()
.
antMatchers
(
"/webjars/**"
).
anonymous
()
...
...
ruoyi/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
View file @
2cc14e5f
...
...
@@ -59,7 +59,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
nowDataMap
.
put
(
REPEAT_PARAMS
,
nowParams
);
nowDataMap
.
put
(
REPEAT_TIME
,
System
.
currentTimeMillis
());
// 请求地址(作为存放
session
的key值)
// 请求地址(作为存放
cache
的key值)
String
url
=
request
.
getRequestURI
();
Object
sessionObj
=
redisCache
.
getCacheObject
(
CACHE_REPEAT_KEY
);
...
...
ruoyi/src/main/java/com/ruoyi/framework/task/RyTask.java
0 → 100644
View file @
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
(
"执行无参方法"
);
}
}
ruoyi/src/main/java/com/ruoyi/framework/web/domain/Server.java
View file @
2cc14e5f
...
...
@@ -28,7 +28,6 @@ import oshi.util.Util;
*/
public
class
Server
{
private
static
final
int
OSHI_WAIT_SECOND
=
1000
;
/**
...
...
ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java
View file @
2cc14e5f
...
...
@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.multipart.MultipartFile
;
import
com.ruoyi.common.constant.Constants
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.file.FileUploadUtils
;
import
com.ruoyi.common.utils.file.FileUtils
;
...
...
@@ -86,4 +87,23 @@ public class CommonController
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
());
}
}
ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java
0 → 100644
View file @
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
();
}
}
ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java
0 → 100644
View file @
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
();
}
}
ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysJob.java
0 → 100644
View file @
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
ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysJobLog.java
0 → 100644
View file @
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
();
}
}
ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysJobLogMapper.java
0 → 100644
View file @
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
();
}
ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysJobMapper.java
0 → 100644
View file @
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
);
}
ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysJobLogService.java
0 → 100644
View file @
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
();
}
ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysJobService.java
0 → 100644
View file @
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
ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysJobLogServiceImpl.java
0 → 100644
View file @
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
();
}
}
ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
0 → 100644
View file @
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
ruoyi/src/main/resources/application.yml
View file @
2cc14e5f
...
...
@@ -3,7 +3,7 @@ ruoyi:
# 名称
name
:
RuoYi
# 版本
version
:
2.
1
.0
version
:
2.
2
.0
# 版权年份
copyrightYear
:
2019
# 实例演示开关
...
...
@@ -28,7 +28,6 @@ server:
# Tomcat启动初始化的线程数,默认值25
min-spare-threads
:
30
# 日志配置
logging
:
level
:
...
...
ruoyi/src/main/resources/mybatis/system/SysJobLogMapper.xml
0 → 100644
View file @
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
ruoyi/src/main/resources/mybatis/system/SysJobMapper.xml
0 → 100644
View file @
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment