Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Eladmin
Commits
68e62678
"...src/main/git@ustchcs.com:gujinli1118/eladmin.git" did not exist on "651253f640ad2801ffcbf271dd617174a474a564"
Commit
68e62678
authored
Jan 08, 2019
by
郑杰
Browse files
v1.4 版本发布,修复bug、优化细节、新增定时任务管理,详细信息查看发行版说明
parent
588bff02
Changes
30
Hide whitespace changes
Inline
Side-by-side
src/main/java/me/zhengjie/quartz/service/query/QuartzJobQueryService.java
0 → 100644
View file @
68e62678
package
me.zhengjie.quartz.service.query
;
import
me.zhengjie.common.utils.PageUtil
;
import
me.zhengjie.quartz.domain.QuartzJob
;
import
me.zhengjie.quartz.repository.QuartzJobRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.Cacheable
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.ObjectUtils
;
import
javax.persistence.criteria.CriteriaBuilder
;
import
javax.persistence.criteria.CriteriaQuery
;
import
javax.persistence.criteria.Predicate
;
import
javax.persistence.criteria.Root
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author jie
* @date 2019-01-07
*/
@Service
@CacheConfig
(
cacheNames
=
"quartzJob"
)
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
QuartzJobQueryService
{
@Autowired
private
QuartzJobRepository
quartzJobRepository
;
@Cacheable
(
keyGenerator
=
"keyGenerator"
)
public
Object
queryAll
(
QuartzJob
quartzJob
,
Pageable
pageable
){
return
PageUtil
.
toPage
(
quartzJobRepository
.
findAll
(
new
Spec
(
quartzJob
),
pageable
));
}
class
Spec
implements
Specification
<
QuartzJob
>
{
private
QuartzJob
quartzJob
;
public
Spec
(
QuartzJob
quartzJob
){
this
.
quartzJob
=
quartzJob
;
}
@Override
public
Predicate
toPredicate
(
Root
<
QuartzJob
>
root
,
CriteriaQuery
<?>
criteriaQuery
,
CriteriaBuilder
cb
)
{
List
<
Predicate
>
list
=
new
ArrayList
<
Predicate
>();
if
(!
ObjectUtils
.
isEmpty
(
quartzJob
.
getJobName
())){
/**
* 模糊
*/
list
.
add
(
cb
.
like
(
root
.
get
(
"jobName"
).
as
(
String
.
class
),
"%"
+
quartzJob
.
getJobName
()+
"%"
));
}
Predicate
[]
p
=
new
Predicate
[
list
.
size
()];
return
cb
.
and
(
list
.
toArray
(
p
));
}
}
}
src/main/java/me/zhengjie/quartz/service/query/QuartzLogQueryService.java
0 → 100644
View file @
68e62678
package
me.zhengjie.quartz.service.query
;
import
me.zhengjie.common.utils.PageUtil
;
import
me.zhengjie.quartz.domain.QuartzLog
;
import
me.zhengjie.quartz.repository.QuartzLogRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.ObjectUtils
;
import
javax.persistence.criteria.CriteriaBuilder
;
import
javax.persistence.criteria.CriteriaQuery
;
import
javax.persistence.criteria.Predicate
;
import
javax.persistence.criteria.Root
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author jie
* @date 2019-01-07
*/
@Service
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
QuartzLogQueryService
{
@Autowired
private
QuartzLogRepository
quartzLogRepository
;
public
Object
queryAll
(
QuartzLog
quartzLog
,
Pageable
pageable
){
return
PageUtil
.
toPage
(
quartzLogRepository
.
findAll
(
new
Spec
(
quartzLog
),
pageable
));
}
class
Spec
implements
Specification
<
QuartzLog
>
{
private
QuartzLog
quartzLog
;
public
Spec
(
QuartzLog
quartzLog
){
this
.
quartzLog
=
quartzLog
;
}
@Override
public
Predicate
toPredicate
(
Root
<
QuartzLog
>
root
,
CriteriaQuery
<?>
criteriaQuery
,
CriteriaBuilder
cb
)
{
List
<
Predicate
>
list
=
new
ArrayList
<
Predicate
>();
if
(!
ObjectUtils
.
isEmpty
(
quartzLog
.
getJobName
())){
/**
* 模糊
*/
list
.
add
(
cb
.
like
(
root
.
get
(
"jobName"
).
as
(
String
.
class
),
"%"
+
quartzLog
.
getJobName
()+
"%"
));
}
if
(!
ObjectUtils
.
isEmpty
(
quartzLog
.
getIsSuccess
()))
{
list
.
add
(
cb
.
equal
(
root
.
get
(
"isSuccess"
).
as
(
Boolean
.
class
),
quartzLog
.
getIsSuccess
()));
}
Predicate
[]
p
=
new
Predicate
[
list
.
size
()];
return
cb
.
and
(
list
.
toArray
(
p
));
}
}
}
src/main/java/me/zhengjie/quartz/task/TestTask.java
0 → 100644
View file @
68e62678
package
me.zhengjie.quartz.task
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
/**
* 测试用
* @author jie
* @date 2019-01-08
*/
@Slf4j
@Component
public
class
TestTask
{
public
void
run
(){
log
.
info
(
"执行成功"
);
}
public
void
run1
(
String
str
){
log
.
info
(
"执行成功,参数为: {}"
+
str
);
}
}
src/main/java/me/zhengjie/
monitor/config/VisitsScheduling
.java
→
src/main/java/me/zhengjie/
quartz/task/VisitsTask
.java
View file @
68e62678
package
me.zhengjie.
monitor.config
;
package
me.zhengjie.
quartz.task
;
import
me.zhengjie.monitor.service.VisitsService
;
import
me.zhengjie.monitor.service.VisitsService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
/**
/**
...
@@ -11,17 +9,12 @@ import org.springframework.stereotype.Component;
...
@@ -11,17 +9,12 @@ import org.springframework.stereotype.Component;
* @date 2018-12-25
* @date 2018-12-25
*/
*/
@Component
@Component
@Async
public
class
VisitsTask
{
public
class
VisitsScheduling
{
@Autowired
@Autowired
private
VisitsService
visitsService
;
private
VisitsService
visitsService
;
/**
public
void
run
(){
* 每天0点运行
*/
@Scheduled
(
cron
=
"0 0 0 * * ?"
)
public
void
save
(){
visitsService
.
save
();
visitsService
.
save
();
}
}
}
}
src/main/java/me/zhengjie/quartz/utils/ExecutionJob.java
0 → 100644
View file @
68e62678
package
me.zhengjie.quartz.utils
;
import
me.zhengjie.common.utils.SpringContextHolder
;
import
me.zhengjie.common.utils.ThrowableUtil
;
import
me.zhengjie.quartz.domain.QuartzJob
;
import
me.zhengjie.quartz.domain.QuartzLog
;
import
me.zhengjie.quartz.repository.QuartzLogRepository
;
import
me.zhengjie.quartz.service.QuartzJobService
;
import
org.quartz.JobExecutionContext
;
import
org.quartz.Scheduler
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.scheduling.quartz.QuartzJobBean
;
import
javax.annotation.Resource
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Future
;
/**
* 参考人人开源,https://gitee.com/renrenio/renren-security
* @author
* @date 2019-01-07
*/
@Async
public
class
ExecutionJob
extends
QuartzJobBean
{
@Resource
(
name
=
"scheduler"
)
private
Scheduler
scheduler
;
private
Logger
logger
=
LoggerFactory
.
getLogger
(
this
.
getClass
());
@Autowired
private
ExecutorService
executorService
;
@Override
protected
void
executeInternal
(
JobExecutionContext
context
)
{
QuartzJob
quartzJob
=
(
QuartzJob
)
context
.
getMergedJobDataMap
().
get
(
QuartzJob
.
JOB_KEY
);
// 获取spring bean
QuartzLogRepository
quartzLogRepository
=
SpringContextHolder
.
getBean
(
"quartzLogRepository"
);
QuartzJobService
quartzJobService
=
SpringContextHolder
.
getBean
(
"quartzJobService"
);
QuartzManage
quartzManage
=
SpringContextHolder
.
getBean
(
"quartzManage"
);
QuartzLog
log
=
new
QuartzLog
();
log
.
setJobName
(
quartzJob
.
getJobName
());
log
.
setBeanName
(
quartzJob
.
getBeanName
());
log
.
setMethodName
(
quartzJob
.
getMethodName
());
log
.
setParams
(
quartzJob
.
getParams
());
long
startTime
=
System
.
currentTimeMillis
();
log
.
setCronExpression
(
quartzJob
.
getCronExpression
());
try
{
// 执行任务
logger
.
info
(
"任务准备执行,任务名称:{}"
,
quartzJob
.
getJobName
());
QuartzRunnable
task
=
new
QuartzRunnable
(
quartzJob
.
getBeanName
(),
quartzJob
.
getMethodName
(),
quartzJob
.
getParams
());
Future
<?>
future
=
executorService
.
submit
(
task
);
future
.
get
();
long
times
=
System
.
currentTimeMillis
()
-
startTime
;
log
.
setTime
(
times
);
// 任务状态
log
.
setIsSuccess
(
true
);
logger
.
info
(
"任务执行完毕,任务名称:{} 总共耗时:{} 毫秒"
,
quartzJob
.
getJobName
(),
times
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"任务执行失败,任务名称:{}"
+
quartzJob
.
getJobName
(),
e
);
long
times
=
System
.
currentTimeMillis
()
-
startTime
;
log
.
setTime
(
times
);
// 任务状态 0:成功 1:失败
log
.
setIsSuccess
(
false
);
log
.
setExceptionDetail
(
ThrowableUtil
.
getStackTrace
(
e
));
//出错就暂停任务
quartzManage
.
pauseJob
(
quartzJob
);
//更新状态
quartzJobService
.
updateIsPause
(
quartzJob
);
}
finally
{
quartzLogRepository
.
save
(
log
);
}
}
}
src/main/java/me/zhengjie/quartz/utils/QuartzManage.java
0 → 100644
View file @
68e62678
package
me.zhengjie.quartz.utils
;
import
lombok.extern.slf4j.Slf4j
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.quartz.domain.QuartzJob
;
import
org.quartz.*
;
import
org.quartz.impl.triggers.CronTriggerImpl
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
import
static
org
.
quartz
.
TriggerBuilder
.
newTrigger
;
/**
* @author jie
* @date 2019-01-07
*/
@Slf4j
@Component
public
class
QuartzManage
{
private
static
final
String
JOB_NAME
=
"TASK_"
;
@Resource
(
name
=
"scheduler"
)
private
Scheduler
scheduler
;
public
void
addJob
(
QuartzJob
quartzJob
){
try
{
// 构建job信息
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
ExecutionJob
.
class
).
withIdentity
(
JOB_NAME
+
quartzJob
.
getId
()).
build
();
//通过触发器名和cron 表达式创建 Trigger
Trigger
cronTrigger
=
newTrigger
()
.
withIdentity
(
JOB_NAME
+
quartzJob
.
getId
())
.
startNow
()
.
withSchedule
(
CronScheduleBuilder
.
cronSchedule
(
quartzJob
.
getCronExpression
()))
.
build
();
cronTrigger
.
getJobDataMap
().
put
(
QuartzJob
.
JOB_KEY
,
quartzJob
);
//重置启动时间
((
CronTriggerImpl
)
cronTrigger
).
setStartTime
(
new
Date
());
//执行定时任务
scheduler
.
scheduleJob
(
jobDetail
,
cronTrigger
);
// 暂停任务
if
(
quartzJob
.
getIsPause
())
{
pauseJob
(
quartzJob
);
}
}
catch
(
Exception
e
){
log
.
error
(
"创建定时任务失败"
,
e
);
throw
new
BadRequestException
(
e
.
getMessage
());
}
}
/**
* 更新job cron表达式
* @param quartzJob
* @throws SchedulerException
*/
public
void
updateJobCron
(
QuartzJob
quartzJob
){
try
{
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
JOB_NAME
+
quartzJob
.
getId
());
CronTrigger
trigger
=
(
CronTrigger
)
scheduler
.
getTrigger
(
triggerKey
);
CronScheduleBuilder
scheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
quartzJob
.
getCronExpression
());
trigger
=
trigger
.
getTriggerBuilder
().
withIdentity
(
triggerKey
).
withSchedule
(
scheduleBuilder
).
build
();
//重置启动时间
((
CronTriggerImpl
)
trigger
).
setStartTime
(
new
Date
());
scheduler
.
rescheduleJob
(
triggerKey
,
trigger
);
// 暂停任务
if
(
quartzJob
.
getIsPause
())
{
pauseJob
(
quartzJob
);
}
}
catch
(
Exception
e
){
log
.
error
(
"更新定时任务失败"
,
e
);
throw
new
BadRequestException
(
e
.
getMessage
());
}
}
/**
* 删除一个job
* @param quartzJob
* @throws SchedulerException
*/
public
void
deleteJob
(
QuartzJob
quartzJob
){
try
{
JobKey
jobKey
=
JobKey
.
jobKey
(
JOB_NAME
+
quartzJob
.
getId
());
scheduler
.
deleteJob
(
jobKey
);
}
catch
(
Exception
e
){
log
.
error
(
"删除定时任务失败"
,
e
);
throw
new
BadRequestException
(
e
.
getMessage
());
}
}
/**
* 恢复一个job
* @param quartzJob
* @throws SchedulerException
*/
public
void
resumeJob
(
QuartzJob
quartzJob
){
try
{
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
JOB_NAME
+
quartzJob
.
getId
());
CronTrigger
trigger
=
(
CronTrigger
)
scheduler
.
getTrigger
(
triggerKey
);
// 如果不存在则创建一个定时任务
if
(
trigger
==
null
){
addJob
(
quartzJob
);
}
JobKey
jobKey
=
JobKey
.
jobKey
(
JOB_NAME
+
quartzJob
.
getId
());
scheduler
.
resumeJob
(
jobKey
);
}
catch
(
Exception
e
){
log
.
error
(
"恢复定时任务失败"
,
e
);
throw
new
BadRequestException
(
e
.
getMessage
());
}
}
/**
* 立即执行job
* @param quartzJob
* @throws SchedulerException
*/
public
void
runAJobNow
(
QuartzJob
quartzJob
){
try
{
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
JOB_NAME
+
quartzJob
.
getId
());
CronTrigger
trigger
=
(
CronTrigger
)
scheduler
.
getTrigger
(
triggerKey
);
// 如果不存在则创建一个定时任务
if
(
trigger
==
null
){
addJob
(
quartzJob
);
}
JobDataMap
dataMap
=
new
JobDataMap
();
dataMap
.
put
(
QuartzJob
.
JOB_KEY
,
quartzJob
);
JobKey
jobKey
=
JobKey
.
jobKey
(
JOB_NAME
+
quartzJob
.
getId
());
scheduler
.
triggerJob
(
jobKey
,
dataMap
);
}
catch
(
Exception
e
){
log
.
error
(
"定时任务执行失败"
,
e
);
throw
new
BadRequestException
(
e
.
getMessage
());
}
}
/**
* 暂停一个job
* @param quartzJob
* @throws SchedulerException
*/
public
void
pauseJob
(
QuartzJob
quartzJob
){
try
{
JobKey
jobKey
=
JobKey
.
jobKey
(
JOB_NAME
+
quartzJob
.
getId
());
scheduler
.
pauseJob
(
jobKey
);
}
catch
(
Exception
e
){
log
.
error
(
"定时任务暂停失败"
,
e
);
throw
new
BadRequestException
(
e
.
getMessage
());
}
}
}
src/main/java/me/zhengjie/quartz/utils/QuartzRunnable.java
0 → 100644
View file @
68e62678
package
me.zhengjie.quartz.utils
;
import
lombok.extern.slf4j.Slf4j
;
import
me.zhengjie.common.utils.SpringContextHolder
;
import
org.apache.commons.lang3.StringUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.util.ReflectionUtils
;
import
java.lang.reflect.Method
;
/**
* 执行定时任务
* @author
*/
@Slf4j
public
class
QuartzRunnable
implements
Runnable
{
private
Object
target
;
private
Method
method
;
private
String
params
;
QuartzRunnable
(
String
beanName
,
String
methodName
,
String
params
)
throws
NoSuchMethodException
,
SecurityException
{
this
.
target
=
SpringContextHolder
.
getBean
(
beanName
);
this
.
params
=
params
;
if
(
StringUtils
.
isNotBlank
(
params
))
{
this
.
method
=
target
.
getClass
().
getDeclaredMethod
(
methodName
,
String
.
class
);
}
else
{
this
.
method
=
target
.
getClass
().
getDeclaredMethod
(
methodName
);
}
}
@Override
public
void
run
()
{
try
{
ReflectionUtils
.
makeAccessible
(
method
);
if
(
StringUtils
.
isNotBlank
(
params
))
{
method
.
invoke
(
target
,
params
);
}
else
{
method
.
invoke
(
target
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"定时任务执行失败"
,
e
);
}
}
}
src/main/java/me/zhengjie/system/service/impl/MenuServiceImpl.java
View file @
68e62678
...
@@ -162,13 +162,15 @@ public class MenuServiceImpl implements MenuService {
...
@@ -162,13 +162,15 @@ public class MenuServiceImpl implements MenuService {
if
(
menuDTO
.
getPid
().
equals
(
0L
)){
if
(
menuDTO
.
getPid
().
equals
(
0L
)){
//一级目录需要加斜杠,不然访问不了
//一级目录需要加斜杠,不然访问不了
menuVo
.
setPath
(
"/"
+
menuDTO
.
getPath
());
menuVo
.
setPath
(
"/"
+
menuDTO
.
getPath
());
menuVo
.
setRedirect
(
"noredirect"
);
menuVo
.
setComponent
(
StrUtil
.
isEmpty
(
menuDTO
.
getComponent
())?
"Layout"
:
menuDTO
.
getComponent
());
}
else
if
(!
StrUtil
.
isEmpty
(
menuDTO
.
getComponent
())){
menuVo
.
setComponent
(
menuDTO
.
getComponent
());
}
}
menuVo
.
setComponent
(
StrUtil
.
isEmpty
(
menuDTO
.
getComponent
())?
"Layout"
:
menuDTO
.
getComponent
());
}
}
menuVo
.
setMeta
(
new
MenuMetaVo
(
menuDTO
.
getName
(),
menuDTO
.
getIcon
()));
menuVo
.
setMeta
(
new
MenuMetaVo
(
menuDTO
.
getName
(),
menuDTO
.
getIcon
()));
if
(
menuDTOList
!=
null
&&
menuDTOList
.
size
()!=
0
){
if
(
menuDTOList
!=
null
&&
menuDTOList
.
size
()!=
0
){
menuVo
.
setAlwaysShow
(
true
);
menuVo
.
setAlwaysShow
(
true
);
menuVo
.
setRedirect
(
"noredirect"
);
menuVo
.
setChildren
(
buildMenus
(
menuDTOList
));
menuVo
.
setChildren
(
buildMenus
(
menuDTOList
));
// 处理是一级菜单并且没有子菜单的情况
// 处理是一级菜单并且没有子菜单的情况
}
else
if
(
menuDTO
.
getPid
().
equals
(
0L
)){
}
else
if
(
menuDTO
.
getPid
().
equals
(
0L
)){
...
...
src/main/java/me/zhengjie/system/service/impl/VerificationCodeServiceImpl.java
View file @
68e62678
...
@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
...
@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.TimeUnit
;
...
...
src/main/resources/application.yml
View file @
68e62678
...
@@ -46,7 +46,6 @@ spring:
...
@@ -46,7 +46,6 @@ spring:
jpa
:
jpa
:
properties
:
properties
:
hibernate
:
hibernate
:
show_sql
:
true
dialect
:
org.hibernate.dialect.MySQL5InnoDBDialect
dialect
:
org.hibernate.dialect.MySQL5InnoDBDialect
hibernate
:
hibernate
:
ddl-auto
:
update
ddl-auto
:
update
...
...
Prev
1
2
Next
Write
Preview
Supports
Markdown
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