Snail-Job 集成

weihm
5
2025-05-12

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 日志配置

logback.xml

<!-- Snail appender -->

<appender name="snailLogAppender" class="com.aizuda.snailjob.client.common.appender.SnailLogbackAppender"></appender>

<!-- 控制台输出日志级别 -->

<root level="info">  

    .... 其他配置 ....

    <appender-ref ref="snailLogAppender" />

</root>

log4j2.xml

 <!-- 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 示例

注解- 单个任务

     /**

     * <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

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/leijiwen/article/details/144185973