Snail-Job 集成
1. 服务端部署
docker环境
1.1 执行数据库脚本
根据当前使用的数据库运行官网提供的sql脚本
1.2 docker-compose
services:
snail-job-server:
image: opensnail/snail-job:latest
container_name: snail-job-server
ports:
- "8080:8080"
- "1788:1788"
environment:
- PARAMS=--spring.datasource.username=root
--spring.datasource.password=your password
--spring.datasource.url=jdbc:mysql://IP:3306/snail_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
--spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
volumes:
- ./snail-job/logs:/snailjob/server/data/log:rw
将上面的内容粘贴到服务器上的docker-compose.yml
文件中,然后运行命令
docker-compose up -d snail-job-server
ps: 需要修改
spring.datasource.password
、spring.datasource.url
2. 客户端集成
2.1 pom.xml
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>${snail-job.version}</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>${snail-job.version}</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId>
<version>${snail-job.version}</version>
</dependency>
需要注意JDK17及以上和JDK8环境中 版本号有区别
2.2 客户端配置
snail-job:
# 任务调度服务器信息
server:
# 服务器IP地址(或域名)
host: 127.0.0.1
# 服务器通讯端口(不是后台管理页面服务端口)
port: 1788
# 命名空间
namespace:
# 接入组名(需要在 SnailJob 后台组管理创建对应名称的组)注意:若通过注解配置了这里的配置不生效
group:
# 接入组 token
token:
# 客户端绑定IP,必须服务器可以访问到;默认自动推断,在服务器无法调度客户端时需要手动配置
# host:
# 客户端通讯端口,默认 1789
port: 1789
然后需要在启动类中添加注解:@EnableSnailJob
@SpringBootApplication
@EnableSnailJob
public class SnailJobSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SnailJobSpringbootApplication.class, args);
}
}
2.3 日志配置
<!-- Snail appender -->
<appender name="snailLogAppender" class="com.aizuda.snailjob.client.common.appender.SnailLogbackAppender"></appender>
<!-- 控制台输出日志级别 -->
<root level="info">
.... 其他配置 ....
<appender-ref ref="snailLogAppender" />
</root>
<!-- SnailLog4j2 appender -->
<SnailLog4j2Appender name="SnailLog4j2Appender" ignoreExceptions="true" />
<Loggers>
<Root level="info">
.... 其他配置 ....
<AppenderRef ref="SnailLog4j2Appender"/>
</Root>
</Loggers>
2.4 模块化(推荐)
- 新建模块
- 在
pom.xml
文件中引入Snail-Job
的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>me.flyray.bsin</groupId>
<artifactId>bsin-common-all</artifactId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<artifactId>bsin-common-job</artifactId>
<packaging>jar</packaging>
<description>bsin-common-job 定时任务模块</description>
<properties>
<snail-job.version>1.2.0-jdk8</snail-job.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- SnailJob client -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>${snail-job.version}</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>${snail-job.version}</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId>
<version>${snail-job.version}</version>
</dependency>
<!-- Logback 依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>provided</scope>
</dependency>
<!-- Log4j2 依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
- 配置类
/**
* SnailJob基础配置
*/
@AutoConfiguration
@ConditionalOnProperty(prefix = "snail-job", name = "enabled", havingValue = "true")
@EnableScheduling
@EnableSnailJob
public class SnailJobConfig {
/**
* Logback配置类
*/
@Configuration
@ConditionalOnClass(value = {
ch.qos.logback.classic.LoggerContext.class,SnailLogbackAppender.class})
public static class LogbackConfiguration {
@EventListener(SnailClientStartingEvent.class)
public void onStarting(SnailClientStartingEvent event) {
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
SnailLogbackAppender<ILoggingEvent> appender = new SnailLogbackAppender<>();
appender.setName("snail_log_appender");
appender.setContext(context);
appender.start();
Logger rootLogger = context.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(appender);
}
}
/**
* Log4j2配置类
*/
@Configuration
@ConditionalOnClass(value = {
org.apache.logging.log4j.core.LoggerContext.class,SnailLog4j2Appender.class})
public static class Log4j2Configuration {
@EventListener(SnailClientStartingEvent.class)
public void onStarting(SnailClientStartingEvent event) {
org.apache.logging.log4j.core.LoggerContext context =
(org.apache.logging.log4j.core.LoggerContext) org.apache.logging.log4j.LogManager.getContext(false);
org.apache.logging.log4j.core.config.Configuration config = context.getConfiguration();
Layout<?> layout = org.apache.logging.log4j.core.layout.PatternLayout.createDefaultLayout(config);
SnailLog4j2Appender snailAppender = SnailLog4j2Appender.create("snail_log_appender",null,layout,"true",null,null);
snailAppender.start();
config.addAppender(snailAppender);
config.getRootLogger().addAppender(snailAppender, org.apache.logging.log4j.Level.INFO, null);
context.updateLoggers();
}
}
}
ps:由于配置类中对日志配置进行了配置,就无需在日志框架的xml文件中进行配置
- Spring Boot 配置
-
在
reasource
中依次建立文件夹:META-INF
、spring
-
新建文件:
org.springframework.boot.autoconfigure.AutoConfiguration.imports
,将配置类的包名+类名粘贴到文件中
me.flyray.bsin.job.config.SnailJobConfig
- 业务服务端引入
<!-- job -->
<dependency>
<groupId>me.flyray.bsin</groupId>
<artifactId>bsin-common-job</artifactId>
<version>${version}</version>
</dependency>
然后在配置文件中的Snail-Job
的配置加入
snail-job:
# 是否开启任务调度
enabled: true
3. 定时任务
3.1 新建定时任务测试类
@Component
@JobExecutor(name = "singleAnnotationJob")
public class SingleAnnotationJobTest {
/**
* <p>
* 由于JobExecutor注解默认的方法名为jobExecute
* 如果想自定义方法名则: @JobExecutor(name = "singleAnnotationJob",method=自定义方法名)
* </p>
* @param jobArgs
* @return
*/
public ExecuteResult jobExecute(JobArgs jobArgs){
//上报日志
SnailJobLog.REMOTE.info("执行定时任务,{}",jobArgs);
return ExecuteResult.success("执行成功~~~");
}
}
3.2 新建定时任务
在Snail-Job的后台界面中的定时任务中点击新建定时任务
3.3 执行结果
3.4 示例
- 注解- 单个任务
/**
* <p>
* 由于JobExecutor注解默认的方法名为jobExecute
* 如果想自定义方法名则: @JobExecutor(name = "singleAnnotationJob",method=自定义方法名)
* </p>
* @param jobArgs
* @return
*/
public ExecuteResult jobExecute(JobArgs jobArgs){
//上报日志
SnailJobLog.REMOTE.info("执行定时任务,{}",jobArgs);
return ExecuteResult.success("执行成功~~~");
}
}
- 注解-多个任务
@Component
public class MultipleJobTest {
@JobExecutor(name = "testA",method = "testA")
public ExecuteResult testA(JobArgs jobArgs){
//控制台日志
SnailJobLog.LOCAL.info("执行定时任务A,参数:{}",jobArgs);
//上报日志到服务端
SnailJobLog.REMOTE.info("执行定时任务A,参数:{}",jobArgs);
return ExecuteResult.success("执行成功");
}
@JobExecutor(name = "testB",method = "testB")
public ExecuteResult testB(JobArgs jobArgs){
//控制台日志
SnailJobLog.LOCAL.info("执行定时任务B,参数:{}",jobArgs);
//上报日志到服务端
SnailJobLog.REMOTE.info("执行定时任务B,参数:{}",jobArgs);
return ExecuteResult.success("执行成功");
}
}
- 继承
@Component
public class ExtendJobTest extends AbstractJobExecutor {
@Override
protected ExecuteResult doJobExecute(JobArgs jobArgs) {
SnailJobLog.REMOTE.info("执行定时任务,参数:{}", jobArgs);
return ExecuteResult.success("执行定时任务成功~");
}
}
开源地址: https://gitee.com/s11e-DAO/bsin-paas-os