Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
H
HSCloudAgent-Client
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
谢恒
HSCloudAgent-Client
Commits
67ccdee9
Commit
67ccdee9
authored
May 13, 2021
by
谢恒
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HSCLOUD_CLIENT
parent
c6660225
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
897 additions
and
153 deletions
+897
-153
pom.xml
pom.xml
+29
-6
MANIFEST.MF
src/main/java/META-INF/MANIFEST.MF
+3
-0
DataBase.java
src/main/java/com/hs/admin/bean/DataBase.java
+27
-0
MqData.java
src/main/java/com/hs/admin/bean/MqData.java
+13
-0
Student.java
src/main/java/com/hs/admin/bean/Student.java
+11
-0
QuartzConfigration.java
src/main/java/com/hs/admin/config/QuartzConfigration.java
+77
-0
SysTaskDao.java
src/main/java/com/hs/admin/dao/SysTaskDao.java
+13
-7
JobFactory.java
src/main/java/com/hs/admin/factory/JobFactory.java
+25
-0
TestJob.java
src/main/java/com/hs/admin/job/TestJob.java
+156
-0
RabbitMqListener.java
src/main/java/com/hs/admin/listener/RabbitMqListener.java
+48
-0
SchedulerJobListener.java
...main/java/com/hs/admin/listener/SchedulerJobListener.java
+30
-0
JobManagerService.java
src/main/java/com/hs/admin/service/JobManagerService.java
+21
-0
SchedulerJobService.java
src/main/java/com/hs/admin/service/SchedulerJobService.java
+22
-0
JobManagerServiceImpl.java
...java/com/hs/admin/service/impl/JobManagerServiceImpl.java
+155
-0
SchedulerJobServiceImpl.java
...va/com/hs/admin/service/impl/SchedulerJobServiceImpl.java
+147
-0
DynamicDataBaseUtil.java
src/main/java/com/hs/admin/util/DynamicDataBaseUtil.java
+28
-0
SysTaskDao.xml
src/main/resources/mapper/SysTaskDao.xml
+62
-140
quartz.properties
src/main/resources/quartz.properties
+30
-0
admin.db
src/main/resources/static/sqlite/admin.db
+0
-0
No files found.
pom.xml
View file @
67ccdee9
...
...
@@ -26,12 +26,6 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-thymeleaf
</artifactId>
<version>
2.4.5
</version>
</dependency>
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
...
...
@@ -52,6 +46,35 @@
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
<version>
8.0.24
</version>
</dependency>
<dependency>
<groupId>
com.zaxxer
</groupId>
<artifactId>
HikariCP
</artifactId>
<version>
3.1.0
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-amqp
</artifactId>
</dependency>
<dependency>
<groupId>
com.microsoft.sqlserver
</groupId>
<artifactId>
sqljdbc4
</artifactId>
<version>
4.0
</version>
</dependency>
<dependency>
<groupId>
org.quartz-scheduler
</groupId>
<artifactId>
quartz
</artifactId>
<version>
2.2.1
</version>
</dependency>
<dependency>
<groupId>
org.springframework
</groupId>
<artifactId>
spring-context-support
</artifactId>
<version>
5.2.12.RELEASE
</version>
</dependency>
<dependency>
<groupId>
org.codehaus.jackson
</groupId>
<artifactId>
jackson-mapper-asl
</artifactId>
...
...
src/main/java/META-INF/MANIFEST.MF
0 → 100644
View file @
67ccdee9
Manifest-Version: 1.0
Main-Class: com.hs.admin.AdminApplication
src/main/java/com/hs/admin/bean/DataBase.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
bean
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
DataBase
{
//数据库ip
private
String
host
;
//数据库端口号
private
String
port
;
//数据库表名
private
String
name
;
//数据库用户名
private
String
username
;
//数据库密码
private
String
password
;
//数据库类型,1mysql,2sqlserver,3oracle
private
String
dbType
;
//数据库驱动
private
String
dbDriver
;
private
String
url
;
}
src/main/java/com/hs/admin/bean/MqData.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
bean
;
import
lombok.Data
;
@Data
public
class
MqData
{
private
String
jcbId
;
private
String
jobName
;
private
Integer
type
;
private
String
content
;
private
String
url
;
private
String
guid
;
}
src/main/java/com/hs/admin/bean/Student.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
bean
;
import
lombok.Data
;
@Data
public
class
Student
{
private
Integer
iIden
;
private
Integer
iClassId
;
private
String
sName
;
private
Integer
iAge
;
}
src/main/java/com/hs/admin/config/QuartzConfigration.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
config
;
import
com.hs.admin.factory.JobFactory
;
import
org.quartz.Scheduler
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.config.PropertiesFactoryBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.scheduling.quartz.SchedulerFactoryBean
;
import
java.io.IOException
;
import
java.util.Properties
;
/**
* @author xieheng
*/
@Configuration
public
class
QuartzConfigration
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
QuartzConfigration
.
class
);
@Autowired
JobFactory
jobFactory
;
/**
* @description: 配置bean
* @return: SchedulerFactoryBean
* @author: XieHeng
* @date: 2021/4/27 2:04 下午
*/
@Bean
public
SchedulerFactoryBean
schedulerFactoryBean
()
{
SchedulerFactoryBean
schedulerFactoryBean
=
new
SchedulerFactoryBean
();
try
{
schedulerFactoryBean
.
setOverwriteExistingJobs
(
true
);
schedulerFactoryBean
.
setQuartzProperties
(
getQuartzProperties
());
schedulerFactoryBean
.
setJobFactory
(
jobFactory
);
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
">>>QuartzConfigration配置失败:"
+
e
);
}
return
schedulerFactoryBean
;
}
/**
* @description: 指定配置文件,在配置文件中配置相关属性(quartz.properties在resource根目录下)
* @return: Properties
* @author: XieHeng
* @date: 2021/4/27 2:05 下午
*/
private
Properties
getQuartzProperties
()
{
PropertiesFactoryBean
propertiesFactoryBean
=
new
PropertiesFactoryBean
();
ClassPathResource
resource
=
new
ClassPathResource
(
"/quartz.properties"
);
Properties
properties
=
null
;
propertiesFactoryBean
.
setLocation
(
resource
);
try
{
propertiesFactoryBean
.
afterPropertiesSet
();
properties
=
propertiesFactoryBean
.
getObject
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
properties
;
}
/**
* @description: 获取scheduler
* @return: Scheduler
* @author: XieHeng
* @date: 2021/4/27 2:12 下午
*/
@Bean
(
name
=
"scheduler"
)
public
Scheduler
scheduler
()
{
return
schedulerFactoryBean
().
getScheduler
();
}
}
src/main/java/com/hs/admin/dao/SysTaskDao.java
View file @
67ccdee9
package
com
.
hs
.
admin
.
dao
;
import
com.hs.admin.bean.DataBase
;
import
com.hs.admin.bean.SysTask
;
import
java.util.HashMap
;
...
...
@@ -8,16 +9,9 @@ import java.util.List;
import
java.util.Map
;
public
interface
SysTaskDao
{
int
deleteByPrimaryKey
(
Integer
id
);
int
insert
(
SysTask
record
);
int
insertSelective
(
SysTask
record
);
SysTask
selectByPrimaryKey
(
Integer
id
);
int
updateByPrimaryKeySelective
(
SysTask
record
);
int
updateByPrimaryKey
(
SysTask
record
);
int
delTask
(
Integer
taskId
);
...
...
@@ -27,4 +21,16 @@ public interface SysTaskDao {
int
delTaskById
(
Integer
id
);
Long
getTotalCount
(
HashMap
<
String
,
Object
>
map
);
SysTask
findTaskByJobName
(
String
jobName
);
int
updateMqContent
(
SysTask
sysTask
);
int
update
(
SysTask
task
);
List
<
SysTask
>
getTaskList
();
int
delete
(
SysTask
task
);
DataBase
getDbInfo
(
String
jcbId
);
}
\ No newline at end of file
src/main/java/com/hs/admin/factory/JobFactory.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
factory
;
import
org.quartz.spi.TriggerFiredBundle
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.config.AutowireCapableBeanFactory
;
import
org.springframework.scheduling.quartz.AdaptableJobFactory
;
import
org.springframework.stereotype.Component
;
/**
* @author xieheng
*/
@Component
public
class
JobFactory
extends
AdaptableJobFactory
{
@Autowired
AutowireCapableBeanFactory
autowireCapableBeanFactory
;
@Override
protected
Object
createJobInstance
(
TriggerFiredBundle
bundle
)
throws
Exception
{
Object
jobInstance
=
super
.
createJobInstance
(
bundle
);
//将任务自动注入到factory
autowireCapableBeanFactory
.
autowireBean
(
jobInstance
);
return
jobInstance
;
}
}
src/main/java/com/hs/admin/job/TestJob.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
job
;
import
com.hs.admin.bean.DataBase
;
import
com.hs.admin.bean.MqData
;
import
com.hs.admin.bean.Student
;
import
com.hs.admin.bean.SysTask
;
import
com.hs.admin.dao.SysTaskDao
;
import
com.hs.admin.util.DynamicDataBaseUtil
;
import
com.hs.admin.util.JsonUtils
;
import
com.zaxxer.hikari.HikariDataSource
;
import
org.quartz.*
;
import
org.springframework.amqp.rabbit.core.RabbitTemplate
;
import
org.springframework.jdbc.core.BeanPropertyRowMapper
;
import
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.util.List
;
import
java.util.Properties
;
@DisallowConcurrentExecution
@Component
public
class
TestJob
implements
Job
{
@Resource
RabbitTemplate
rabbitTemplate
;
@Resource
SysTaskDao
sysTaskDao
;
@Override
public
void
execute
(
JobExecutionContext
jobExecutionContext
)
throws
JobExecutionException
{
JobDataMap
jobDataMap
=
jobExecutionContext
.
getTrigger
().
getJobDataMap
();
System
.
out
.
println
(
JsonUtils
.
beanToJson
(
jobDataMap
));
String
triggerTask
=
jobDataMap
.
get
(
"triggerTask"
).
toString
();
SysTask
sysTask
=
JsonUtils
.
jsonToBean
(
triggerTask
,
SysTask
.
class
);
MqData
mqData
=
JsonUtils
.
jsonToBean
(
sysTask
.
getContent
(),
MqData
.
class
);
String
guid
=
mqData
.
getGuid
();
String
jcbId
=
mqData
.
getJcbId
();
String
url
=
mqData
.
getUrl
();
Integer
type
=
mqData
.
getType
();
String
jobName
=
mqData
.
getJobName
();
String
content
=
mqData
.
getContent
();
//根据jcbId选择db操作todo
DataBase
dataBase
=
getDataBaseInfo
(
jcbId
);
HikariDataSource
dataSource
=
null
;
try
{
dataSource
=
DynamicDataBaseUtil
.
configure
(
dataBase
);
NamedParameterJdbcTemplate
jdbcTemplate
=
new
NamedParameterJdbcTemplate
(
dataSource
);
List
<
Student
>
students
=
jdbcTemplate
.
query
(
content
,
new
BeanPropertyRowMapper
<>(
Student
.
class
));
System
.
out
.
println
(
">>>>>>>>>>>"
+
JsonUtils
.
beanToJson
(
students
));
if
(!
CollectionUtils
.
isEmpty
(
students
))
{
for
(
Student
student
:
students
)
{
//将db返回结果发送消息队列
// rabbitTemplate.convertAndSend(RabbitMqConfig.ITEM_TOPIC_EXCHANGE,"",j);
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
finally
{
//每次用完记得关闭连接
dataSource
.
close
();
}
//
// String content = "00...........这是另一个定时任务!" + LocalDateTime.now();
// System.out.println("00...........这是另一个定时任务!" + LocalDateTime.now());
// String path = "/Users/macbookpro/Documents/";
// String date = LocalDate.now().toString();
// String className = this.getClass().getSimpleName();
// path = path + date;
// File file = new File(path);
// if (!file.exists()) {
// file.mkdirs();
// }
// String fileName = path + "/" + className + ".txt";
// FileUtil.writeFile(fileName, content);
}
/**
* @description: 读取本地配置文件
* @param: jcbId
* @return: DataBase
* @author: XieHeng
* @date: 2021/5/7 4:11 下午
*/
private
DataBase
readProperties
(
String
jcbId
)
{
InputStream
inputStream
=
this
.
getClass
().
getClassLoader
().
getResourceAsStream
(
"dbconfig/db.properties"
);
Properties
properties
=
new
Properties
();
try
{
properties
.
load
(
inputStream
);
String
host
=
properties
.
getProperty
(
jcbId
+
"_db_host"
);
String
port
=
properties
.
getProperty
(
jcbId
+
"_db_port"
);
String
username
=
properties
.
getProperty
(
jcbId
+
"_db_username"
);
String
password
=
properties
.
getProperty
(
jcbId
+
"_db_password"
);
String
dbName
=
properties
.
getProperty
(
jcbId
+
"_db_name"
);
String
type
=
properties
.
getProperty
(
jcbId
+
"_db_type"
);
String
driver
=
""
;
String
url
=
""
;
switch
(
type
)
{
//1sqlserver,2mysql,3oracle
case
"1"
:
driver
=
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
;
url
=
"jdbc:sqlserver://"
+
host
+
":"
+
port
+
";DatabaseName="
+
dbName
;
break
;
case
"2"
:
driver
=
"com.mysql.cj.jdbc.Driver"
;
url
=
"jdbc:mysql://"
+
host
+
":"
+
port
+
"/"
+
dbName
;
break
;
case
"3"
:
driver
=
"oracle.jdbc.OracleDriver"
;
url
=
"jdbc:oracle:thin:@//"
+
host
+
":"
+
port
+
"/"
+
dbName
;
break
;
default
:
break
;
}
return
new
DataBase
(
host
,
port
,
dbName
,
username
,
password
,
type
,
driver
,
url
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
private
DataBase
getDataBaseInfo
(
String
jcbId
)
{
DataBase
dataBase
=
sysTaskDao
.
getDbInfo
(
jcbId
);
String
type
=
dataBase
.
getDbType
();
String
host
=
dataBase
.
getHost
();
String
dbName
=
dataBase
.
getName
();
String
port
=
dataBase
.
getPort
();
String
driver
=
null
;
String
url
=
null
;
switch
(
type
)
{
//1sqlserver,2mysql,3oracle
case
"1"
:
driver
=
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
;
url
=
"jdbc:sqlserver://"
+
host
+
":"
+
port
+
";DatabaseName="
+
dbName
;
break
;
case
"2"
:
driver
=
"com.mysql.cj.jdbc.Driver"
;
url
=
"jdbc:mysql://"
+
host
+
":"
+
port
+
"/"
+
dbName
;
break
;
case
"3"
:
driver
=
"oracle.jdbc.OracleDriver"
;
url
=
"jdbc:oracle:thin:@//"
+
host
+
":"
+
port
+
"/"
+
dbName
;
break
;
default
:
break
;
}
dataBase
.
setDbDriver
(
driver
);
dataBase
.
setUrl
(
url
);
return
dataBase
;
}
}
src/main/java/com/hs/admin/listener/RabbitMqListener.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
listener
;
import
com.hs.admin.bean.MqData
;
import
com.hs.admin.bean.SysTask
;
import
com.hs.admin.dao.SysTaskDao
;
import
com.hs.admin.service.SchedulerJobService
;
import
com.hs.admin.util.JsonUtils
;
import
com.hs.admin.util.LogUtil
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
@Component
public
class
RabbitMqListener
{
@Resource
SysTaskDao
sysTaskDao
;
@Resource
SchedulerJobService
schedulerJobService
;
/**
* @description: 消费端消费
* @param: data
* @return: void
* @author: XieHeng
* @date: 2021/5/7 1:41 下午
*/
// @RabbitListener(queues = "item_queue")
public
synchronized
void
mqTest
(
String
data
)
{
LogUtil
.
info
(
">>>>>进入消费,data=:"
+
data
);
MqData
mqData
=
JsonUtils
.
jsonToBean
(
data
,
MqData
.
class
);
if
(
ObjectUtils
.
isEmpty
(
mqData
))
{
LogUtil
.
error
(
">>>>>>item_queue消息消费内容为空"
);
return
;
}
String
jobName
=
mqData
.
getJobName
();
SysTask
sysTask
=
sysTaskDao
.
findTaskByJobName
(
jobName
);
sysTask
.
setContent
(
JsonUtils
.
beanToJson
(
mqData
));
int
i
=
sysTaskDao
.
updateMqContent
(
sysTask
);
if
(
i
==
1
)
{
schedulerJobService
.
deleteJob
(
sysTask
);
schedulerJobService
.
initJob
(
sysTask
);
}
System
.
out
.
println
(
">>>>>消费成功结束"
);
}
}
src/main/java/com/hs/admin/listener/SchedulerJobListener.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
listener
;
import
com.hs.admin.service.SchedulerJobService
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.boot.CommandLineRunner
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
/**
* @author xieheng
*/
@Component
public
class
SchedulerJobListener
implements
CommandLineRunner
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
SchedulerJobListener
.
class
);
@Resource
SchedulerJobService
schedulerJobService
;
@Override
public
void
run
(
String
...
args
)
{
try
{
schedulerJobService
.
initJobList
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
">>>SchedulerJobListener error :"
+
e
);
}
}
}
src/main/java/com/hs/admin/service/JobManagerService.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
service
;
import
com.hs.admin.bean.SysTask
;
/**
* @author xieheng
*/
public
interface
JobManagerService
{
boolean
addJob
(
SysTask
task
);
boolean
pauseJob
(
SysTask
task
);
boolean
resumeJob
(
SysTask
task
);
boolean
deleteJob
(
SysTask
task
);
boolean
runJobNow
(
SysTask
task
);
boolean
updateJobCron
(
SysTask
task
);
}
src/main/java/com/hs/admin/service/SchedulerJobService.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
service
;
import
com.hs.admin.bean.SysTask
;
/**
* @author xieheng
*/
public
interface
SchedulerJobService
{
boolean
initJob
(
SysTask
sysTask
);
boolean
runNow
(
SysTask
sysTask
);
boolean
parseJob
(
SysTask
sysTask
);
boolean
resumeJob
(
SysTask
sysTask
);
boolean
initJobList
();
boolean
deleteJob
(
SysTask
sysTask
);
boolean
editCron
(
SysTask
task
,
String
cron
);
}
src/main/java/com/hs/admin/service/impl/JobManagerServiceImpl.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
service
.
impl
;
import
com.hs.admin.bean.SysTask
;
import
com.hs.admin.service.JobManagerService
;
import
com.hs.admin.util.JsonUtils
;
import
org.quartz.*
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
import
java.net.URL
;
/**
* @author xieheng
*/
@Service
public
class
JobManagerServiceImpl
implements
JobManagerService
{
@Resource
Scheduler
scheduler
;
/**
* 添加任务
*
* @return
*/
@SuppressWarnings
(
"unchecked"
)
@Override
public
boolean
addJob
(
SysTask
task
)
{
try
{
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
Class
<?
extends
Job
>
jobClass
=
(
Class
<?
extends
Job
>)
(
Class
.
forName
(
task
.
getBeanClass
()).
newInstance
().
getClass
());
// 任务名称和组构成任务key
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
jobClass
).
withIdentity
(
task
.
getJobName
(),
task
.
getJobGroup
()).
build
();
// 定义调度触发规则
// 使用cornTrigger规则
// 触发器key
Trigger
trigger
=
TriggerBuilder
.
newTrigger
().
withIdentity
(
task
.
getJobName
(),
task
.
getJobGroup
())
.
startAt
(
DateBuilder
.
futureDate
(
1
,
DateBuilder
.
IntervalUnit
.
SECOND
))
.
withSchedule
(
CronScheduleBuilder
.
cronSchedule
(
task
.
getCronExpression
())).
startNow
().
build
();
trigger
.
getJobDataMap
().
put
(
"triggerTask"
,
JsonUtils
.
beanToJson
(
task
));
// 把作业和触发器注册到任务调度中
Trigger
.
TriggerState
triggerState
=
scheduler
.
getTriggerState
(
trigger
.
getKey
());
if
(
triggerState
.
equals
(
Trigger
.
TriggerState
.
NONE
))
{
scheduler
.
scheduleJob
(
jobDetail
,
trigger
);
// 启动
if
(!
scheduler
.
isShutdown
())
{
scheduler
.
start
();
return
true
;
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
/**
* @description: 暂停任务
* @return: void
* @author: XieHeng
* @date: 2021/4/27 5:35 下午
*/
@Override
public
boolean
pauseJob
(
SysTask
task
)
{
JobKey
jobKey
=
JobKey
.
jobKey
(
task
.
getJobName
(),
task
.
getJobGroup
());
try
{
scheduler
.
pauseJob
(
jobKey
);
return
true
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
/**
* @description: 恢复任务
* @return: void
* @author: XieHeng
* @date: 2021/4/27 5:35 下午
*/
@Override
public
boolean
resumeJob
(
SysTask
task
)
{
JobKey
jobKey
=
JobKey
.
jobKey
(
task
.
getJobName
(),
task
.
getJobGroup
());
try
{
scheduler
.
resumeJob
(
jobKey
);
return
true
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
/**
* @description: 删除任务
* @return: void
* @author: XieHeng
* @date: 2021/4/27 5:35 下午
*/
@Override
public
boolean
deleteJob
(
SysTask
task
)
{
JobKey
jobKey
=
JobKey
.
jobKey
(
task
.
getJobName
(),
task
.
getJobGroup
());
try
{
scheduler
.
deleteJob
(
jobKey
);
return
true
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
/**
* @description: 立马执行任务
* @return: void
* @author: XieHeng
* @date: 2021/4/27 5:35 下午
*/
@Override
public
boolean
runJobNow
(
SysTask
task
)
{
JobKey
jobKey
=
JobKey
.
jobKey
(
task
.
getJobName
(),
task
.
getJobGroup
());
try
{
scheduler
.
triggerJob
(
jobKey
);
return
true
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
/**
* @description: 更新cron表达式
* @return: void
* @author: XieHeng
* @date: 2021/4/27 5:36 下午
*/
@Override
public
boolean
updateJobCron
(
SysTask
task
)
{
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
task
.
getJobName
(),
task
.
getJobGroup
());
try
{
CronTrigger
trigger
=
(
CronTrigger
)
scheduler
.
getTrigger
(
triggerKey
);
CronScheduleBuilder
cronScheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
task
.
getCronExpression
());
trigger
=
trigger
.
getTriggerBuilder
().
withIdentity
(
triggerKey
).
withSchedule
(
cronScheduleBuilder
).
build
();
scheduler
.
rescheduleJob
(
triggerKey
,
trigger
);
return
true
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
public
static
void
main
(
String
[]
args
)
{
URL
url
=
Thread
.
currentThread
().
getContextClassLoader
().
getResource
(
"TestJob"
);
System
.
out
.
println
(
url
.
toString
());
}
}
src/main/java/com/hs/admin/service/impl/SchedulerJobServiceImpl.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
service
.
impl
;
import
com.hs.admin.base.CodeMessageEnum
;
import
com.hs.admin.base.HsRuntimeException
;
import
com.hs.admin.base.JobStateEnum
;
import
com.hs.admin.bean.SysTask
;
import
com.hs.admin.dao.SysTaskDao
;
import
com.hs.admin.service.JobManagerService
;
import
com.hs.admin.service.SchedulerJobService
;
import
com.hs.admin.util.JsonUtils
;
import
com.hs.admin.util.LogUtil
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.util.List
;
/**
* @author xieheng
*/
@Service
public
class
SchedulerJobServiceImpl
implements
SchedulerJobService
{
@Resource
JobManagerService
jobManagerService
;
@Resource
SysTaskDao
sysTaskDao
;
/**
* @description: 校验任务id
* @param: taskId
* @param: request
* @return: void
* @author: XieHeng
* @date: 2021/5/6 11:03 上午
*/
private
void
checkId
(
Long
taskId
,
String
prefix
)
{
if
(
taskId
<
1
)
{
LogUtil
.
error
(
prefix
+
"参数错误:taskId="
+
taskId
);
throw
new
HsRuntimeException
(
CodeMessageEnum
.
REQUEST_ERROR
.
getCode
(),
CodeMessageEnum
.
REQUEST_ERROR
.
getMsg
());
}
}
@Override
public
boolean
initJob
(
SysTask
task
)
{
return
excuteInitJobOperate
(
task
);
}
/**
* @description: 立即执行,只运行一次
* @param: sysTask
* @return: boolean
* @author: XieHeng
* @date: 2021/5/7 2:56 下午
*/
@Override
public
boolean
runNow
(
SysTask
sysTask
)
{
return
jobManagerService
.
runJobNow
(
sysTask
);
}
private
boolean
excuteInitJobOperate
(
SysTask
task
)
{
if
(!
ObjectUtils
.
isEmpty
(
task
))
{
boolean
b
=
jobManagerService
.
addJob
(
task
);
if
(
b
)
{
task
.
setJobStatus
(
JobStateEnum
.
NORMAL
.
getCode
());
return
sysTaskDao
.
update
(
task
)
==
1
;
}
}
else
{
LogUtil
.
error
(
"初始化定时任务失败"
);
throw
new
HsRuntimeException
(
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getCode
(),
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
());
}
return
false
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
boolean
parseJob
(
SysTask
task
)
{
if
(!
ObjectUtils
.
isEmpty
(
task
))
{
boolean
b
=
jobManagerService
.
pauseJob
(
task
);
if
(
b
)
{
task
.
setJobStatus
(
JobStateEnum
.
PAUSED
.
getCode
());
return
sysTaskDao
.
update
(
task
)
==
1
;
}
}
else
{
LogUtil
.
error
(
"暂停任务失败:"
+
JsonUtils
.
beanToJson
(
task
));
throw
new
HsRuntimeException
(
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getCode
(),
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
());
}
return
false
;
}
@Override
public
boolean
resumeJob
(
SysTask
task
)
{
if
(!
ObjectUtils
.
isEmpty
(
task
))
{
boolean
b
=
jobManagerService
.
resumeJob
(
task
);
if
(
b
)
{
task
.
setJobStatus
(
JobStateEnum
.
NORMAL
.
getCode
());
return
sysTaskDao
.
update
(
task
)
==
1
;
}
}
else
{
LogUtil
.
error
(
"恢复任务失败"
+
JsonUtils
.
beanToJson
(
task
));
throw
new
HsRuntimeException
(
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getCode
(),
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
());
}
return
false
;
}
@Override
public
boolean
initJobList
()
{
//从库里查询所有待执行任务
List
<
SysTask
>
taskList
=
sysTaskDao
.
getTaskList
();
if
(!
CollectionUtils
.
isEmpty
(
taskList
))
{
for
(
SysTask
task
:
taskList
)
{
excuteInitJobOperate
(
task
);
}
}
else
{
LogUtil
.
error
(
"initJobList error: 没有待执行任务"
);
throw
new
HsRuntimeException
(
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getCode
(),
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
());
}
return
true
;
}
@Override
public
boolean
deleteJob
(
SysTask
task
)
{
if
(!
ObjectUtils
.
isEmpty
(
task
))
{
jobManagerService
.
deleteJob
(
task
);
return
sysTaskDao
.
delete
(
task
)
==
1
;
}
else
{
LogUtil
.
error
(
"删除任务失败"
+
JsonUtils
.
beanToJson
(
task
));
throw
new
HsRuntimeException
(
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getCode
(),
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
());
}
}
@Override
public
boolean
editCron
(
SysTask
task
,
String
cron
)
{
if
(
ObjectUtils
.
isEmpty
(
task
))
{
throw
new
HsRuntimeException
(
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
(),
CodeMessageEnum
.
RECORDS_NOT_EXIST
.
getMsg
());
}
task
.
setCronExpression
(
cron
);
jobManagerService
.
updateJobCron
(
task
);
sysTaskDao
.
updateByPrimaryKey
(
task
);
jobManagerService
.
runJobNow
(
task
);
return
true
;
}
}
src/main/java/com/hs/admin/util/DynamicDataBaseUtil.java
0 → 100644
View file @
67ccdee9
package
com
.
hs
.
admin
.
util
;
import
com.hs.admin.bean.DataBase
;
import
com.zaxxer.hikari.HikariDataSource
;
public
class
DynamicDataBaseUtil
{
/**
* @description: 配置数据库
* @return: HikariDataSource
* @author: XieHeng
* @date: 2021/5/7 5:02 下午
*/
public
static
HikariDataSource
configure
(
DataBase
dataBase
)
{
HikariDataSource
dataSource
=
new
HikariDataSource
();
dataSource
.
setJdbcUrl
(
dataBase
.
getUrl
());
dataSource
.
setUsername
(
dataBase
.
getUsername
());
dataSource
.
setPassword
(
dataBase
.
getPassword
());
dataSource
.
setDriverClassName
(
dataBase
.
getDbDriver
());
dataSource
.
setMaximumPoolSize
(
2
);
dataSource
.
setMinimumIdle
(
1
);
dataSource
.
setAutoCommit
(
true
);
// dataSource.setConnectionTestQuery("SELECT 1 FROM DUAL");
dataSource
.
addDataSourceProperty
(
"cachePrepStmts"
,
"true"
);
dataSource
.
addDataSourceProperty
(
"prepStmtCacheSize"
,
"250"
);
dataSource
.
addDataSourceProperty
(
"prepStmtCacheSqlLimit"
,
"2048"
);
return
dataSource
;
}
}
src/main/resources/mapper/SysTaskDao.xml
View file @
67ccdee9
...
...
@@ -18,12 +18,6 @@
id, jcb_id, job_name, content, cron_expression, bean_class, job_status, job_group,
create_time, update_time, `type`
</sql>
<select
id=
"selectByPrimaryKey"
parameterType=
"java.lang.Integer"
resultMap=
"BaseResultMap"
>
select
<include
refid=
"Base_Column_List"
/>
from sys_task
where id = #{id,jdbcType=INTEGER}
</select>
<select
id=
"findAllByCondition"
resultType=
"java.util.Map"
>
select st.jcb_id jcbId,
...
...
@@ -50,11 +44,7 @@
where st.jcb_id = #{jcbId}
and st.job_status != 3
</select>
<delete
id=
"deleteByPrimaryKey"
parameterType=
"java.lang.Integer"
>
delete
from sys_task
where id = #{id,jdbcType=INTEGER}
</delete>
<update
id=
"delTaskById"
>
update sys_task
set job_status=3
...
...
@@ -65,133 +55,65 @@
set job_status=3
where id = #{taskId}
</update>
<insert
id=
"insert"
keyColumn=
"id"
keyProperty=
"id"
parameterType=
"com.hs.admin.bean.SysTask"
useGeneratedKeys=
"true"
>
insert into sys_task (jcb_id, job_name, content,
cron_expression, bean_class, job_status,
job_group, create_time, update_time,
`type`)
values (#{jcbId,jdbcType=VARCHAR}, #{jobName,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR},
#{cronExpression,jdbcType=VARCHAR}, #{beanClass,jdbcType=VARCHAR}, #{jobStatus,jdbcType=BOOLEAN},
#{jobGroup,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP},
#{type,jdbcType=BOOLEAN})
</insert>
<insert
id=
"insertSelective"
keyColumn=
"id"
keyProperty=
"id"
parameterType=
"com.hs.admin.bean.SysTask"
useGeneratedKeys=
"true"
>
insert into sys_task
<trim
prefix=
"("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"jcbId != null"
>
jcb_id,
</if>
<if
test=
"jobName != null"
>
job_name,
</if>
<if
test=
"content != null"
>
content,
</if>
<if
test=
"cronExpression != null"
>
cron_expression,
</if>
<if
test=
"beanClass != null"
>
bean_class,
</if>
<if
test=
"jobStatus != null"
>
job_status,
</if>
<if
test=
"jobGroup != null"
>
job_group,
</if>
<if
test=
"createTime != null"
>
create_time,
</if>
<if
test=
"updateTime != null"
>
update_time,
</if>
<if
test=
"type != null"
>
`type`,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"jcbId != null"
>
#{jcbId,jdbcType=VARCHAR},
</if>
<if
test=
"jobName != null"
>
#{jobName,jdbcType=VARCHAR},
</if>
<if
test=
"content != null"
>
#{content,jdbcType=VARCHAR},
</if>
<if
test=
"cronExpression != null"
>
#{cronExpression,jdbcType=VARCHAR},
</if>
<if
test=
"beanClass != null"
>
#{beanClass,jdbcType=VARCHAR},
</if>
<if
test=
"jobStatus != null"
>
#{jobStatus,jdbcType=BOOLEAN},
</if>
<if
test=
"jobGroup != null"
>
#{jobGroup,jdbcType=VARCHAR},
</if>
<if
test=
"createTime != null"
>
#{createTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"updateTime != null"
>
#{updateTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"type != null"
>
#{type,jdbcType=BOOLEAN},
</if>
</trim>
</insert>
<update
id=
"updateByPrimaryKeySelective"
parameterType=
"com.hs.admin.bean.SysTask"
>
update sys_task
<set>
<if
test=
"jcbId != null"
>
jcb_id = #{jcbId,jdbcType=VARCHAR},
</if>
<if
test=
"jobName != null"
>
job_name = #{jobName,jdbcType=VARCHAR},
</if>
<if
test=
"content != null"
>
content = #{content,jdbcType=VARCHAR},
</if>
<if
test=
"cronExpression != null"
>
cron_expression = #{cronExpression,jdbcType=VARCHAR},
</if>
<if
test=
"beanClass != null"
>
bean_class = #{beanClass,jdbcType=VARCHAR},
</if>
<if
test=
"jobStatus != null"
>
job_status = #{jobStatus,jdbcType=BOOLEAN},
</if>
<if
test=
"jobGroup != null"
>
job_group = #{jobGroup,jdbcType=VARCHAR},
</if>
<if
test=
"createTime != null"
>
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"updateTime != null"
>
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
<if
test=
"type != null"
>
`type` = #{type,jdbcType=BOOLEAN},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update
id=
"updateByPrimaryKey"
parameterType=
"com.hs.admin.bean.SysTask"
>
update sys_task
set jcb_id = #{jcbId,jdbcType=VARCHAR},
job_name = #{jobName,jdbcType=VARCHAR},
content = #{content,jdbcType=VARCHAR},
cron_expression = #{cronExpression,jdbcType=VARCHAR},
bean_class = #{beanClass,jdbcType=VARCHAR},
job_status = #{jobStatus,jdbcType=BOOLEAN},
job_group = #{jobGroup,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP},
`type` = #{type,jdbcType=BOOLEAN}
where id = #{id,jdbcType=INTEGER}
</update>
<select
id=
"getTaskList"
resultMap=
"BaseResultMap"
>
select
<include
refid=
"Base_Column_List"
/>
from sys_task where job_status !=3
</select>
<select
id=
"findTaskByJobName"
resultMap=
"BaseResultMap"
>
select
<include
refid=
"Base_Column_List"
/>
from sys_task where job_name=#{jobName} limit 1
</select>
<select
id=
"getDbInfo"
resultType=
"com.hs.admin.bean.DataBase"
>
select db_name name,
db_pwd password,
db_username username,
host,
port,
type dbType
from jcb
where jcb_id = #{jcbId}
and state = 1
limit 1
</select>
<update
id=
"updateMqContent"
>
update sys_task
set content=#{content}
where id = #{id}
</update>
<update
id=
"delete"
>
update sys_task
set job_status=3
where id = #{id}
</update>
<insert
id=
"insert"
keyColumn=
"id"
keyProperty=
"id"
parameterType=
"com.hs.admin.bean.SysTask"
useGeneratedKeys=
"true"
>
insert into sys_task (job_name, content, cron_expression,
bean_class, job_status, job_group,
create_time,
update_time)
values (#{jobName,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{cronExpression,jdbcType=VARCHAR},
#{beanClass,jdbcType=VARCHAR}, #{jobStatus,jdbcType=VARCHAR}, #{jobGroup,jdbcType=VARCHAR},
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
</insert>
<update
id=
"updateByPrimaryKey"
>
update sys_task
set job_name = #{jobName,jdbcType=VARCHAR},
content = #{description,jdbcType=VARCHAR},
cron_expression = #{cronExpression,jdbcType=VARCHAR},
bean_class = #{beanClass,jdbcType=VARCHAR},
job_status = #{jobStatus,jdbcType=INTEGER},
job_group = #{jobGroup,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=BIGINT}
</update>
<update
id=
"update"
>
UPDATE sys_task
SET job_status=#{jobStatus}
where id = #{id}
</update>
</mapper>
\ No newline at end of file
src/main/resources/quartz.properties
0 → 100644
View file @
67ccdee9
#----------------------------------------基础配置------------------------------------------------------------
org.quartz.scheduler.instanceName
=
QuartzScheduler
# 定时任务实例的id 默认自动
org.quartz.scheduler.instanceId
=
AUTO
# 是否是集群的任务
#org.quartz.jobStore.isClustered=true
#--------------------------------------------------------------------------------------------------------
#----------------------------------------集成数据库置------------------------------------------------------------
# 定时任务的表前缀
#org.quartz.jobStore.tablePrefix=QRTZ_
# 使用数据库存储JOB数据
#org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 保证待执行的任务是锁定的,持有锁超时,数据库会自动释放
#org.quartz.jobStore.acquireTriggersWithinLock=true
# 检查集群的状态间隔
#org.quartz.jobStore.clusterCheckinInterval=5000
# 如果当前的执行周期被错过 任务持有的时长超过此时长则认为任务过期,单位ms
#org.quartz.jobStore.misfireThreshold=6000
# 事务的隔离级别 推荐使用默认级别 设置为true容易造成死锁和不可重复读的一些事务问题
#org.quartz.jobStore.txIsolationLevelSerializable=false
#----------------------------------------------------------------------------------------------------
#----------------------------------------线程池配置------------------------------------------------------------
#可参考:https://www.w3cschool.cn/quartz_doc/quartz_doc-7vix2d9n.html
org.quartz.threadPool.class
=
org.quartz.simpl.SimpleThreadPool
# 最多有10个定时任务同时执行
org.quartz.threadPool.threadCount
=
10
# 自创建父线程
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread
=
true
#----------------------------------------------------------------------------------------------------
src/main/resources/static/sqlite/admin.db
View file @
67ccdee9
No preview for this file type
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