>  기사  >  Java  >  SpringBoot가 ShedLock을 통합하여 분산 예약 작업을 구현하는 방법

SpringBoot가 ShedLock을 통합하여 분산 예약 작업을 구현하는 방법

WBOY
WBOY앞으로
2023-05-13 12:55:061073검색

    1. 배경

    프로젝트 서비스가 클러스터에 배포되면 코드에는 모든 사람을 위한 예약된 작업이 있지만 각 노드에서 예약된 작업을 실행하도록 하는 것은 적절하지 않습니다. SpringBoot의 ShedLock은 이 문제를 매우 잘 해결할 수 있습니다. 아래에서는 SpringBoot가 ShedLock을 통합하는 방법과 ShedLock이 분산 타이밍을 구현하는 방법을 자세히 소개합니다.

    2. ShedLock이란

    다음은 외부 저장소를 통해 잠금을 구현하는 ShedLock 잠금 공급자입니다. 아래 그림에서 볼 수 있듯이 외부 저장소와 통합된 라이브러리는 여전히 매우 풍부합니다.

    SpringBoot가 ShedLock을 통합하여 분산 예약 작업을 구현하는 방법

    3 . 구현

    1.1 종속성 패키지 소개 CSedlock Relying Pack:

    <!-- web工程依赖包 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>net.javacrumbs.shedlock</groupId>
        <artifactId>shedlock-spring</artifactId>
        <version>4.2.0</version>
    </dependency>
     <!--每个外部存储实例所需依赖包不一样,这里是jdbc-->
    <dependency>
        <groupId>net.javacrumbs.shedlock</groupId>
        <artifactId>shedlock-provider-jdbc-template</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    E

    종속 패킷 트리 차트:

    SpringBoot가 ShedLock을 통합하여 분산 예약 작업을 구현하는 방법 1.2 데이터베이스 연결 정보 구성

    서버:
    포트: 8105

    Spring:
    데이터 소스:
    URL: mysql: / /127.0.0.1:3306/testjdbc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    사용자 이름: root
    비밀번호: 123456
    드라이버 클래스 이름: com.mysql.cj.jdbc.Driver
    유형: com. mysql .cj.jdbc.MysqlDataSource

    1.3 Mysql 데이터 테이블 만들기
    CREATE TABLE `shedlock` (
    	`name`  varchar(64) NOT NULL COMMENT &#39;name&#39; ,
    	`lock_until`  timestamp(3) NULL DEFAULT NULL ,
    	`locked_at`  timestamp(3) NULL DEFAULT NULL ,
    	`locked_by`  varchar(255) NULL DEFAULT NULL ,
    	PRIMARY KEY (`name`)
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    ROW_FORMAT=DYNAMIC
    ;

    1.4 LockProvider 구성

    ShedLockConfig.java:

    import net.javacrumbs.shedlock.core.LockProvider;
    import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    import javax.annotation.Resource;
    import javax.sql.DataSource;
    /**
     * @description: Shedlock集成Jdbc配置类
     */
    @Component
    public class ShedLockConfig {
        @Resource
        private DataSource dataSource;
        @Bean
        private LockProvider lockProvider() {
            return new JdbcTemplateLockProvider(dataSource);
        }
    }

    springboot 기본 시작 클래스 MerakQuartzApplication:

    import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
    import org.mybatis.spring.annotation.MapperScan;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
    import org.springframework.context.annotation.Bean;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import java.util.concurrent.Executor;
    import java.util.concurrent.ThreadPoolExecutor;
    /**
     * @version 1.0
     * @ClassName: MerakQuartzApplication
     * @description: 工单任务调度
     */
    // 开启定时器
    @EnableScheduling
    // 开启定时任务锁,指定一个默认的锁的时间30秒
    @EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
    @EnableAsync
    @MapperScan(basePackages = {"com.merak.hyper.automation.persist.**.mapper"})
    @SpringBootApplication(scanBasePackages = {"com.merak.hyper.automation.**"}, exclude = {SecurityAutoConfiguration.class})
    public class MerakQuartzApplication {
        public static final Logger log = LoggerFactory.getLogger(MerakQuartzApplication.class);
        public static void main(String[] args) {
            SpringApplication.run(MerakQuartzApplication.class, args);
        }
        private int taskSchedulerCorePoolSize = 15;
        private int awaitTerminationSeconds = 60;
        private String threadNamePrefix = "taskExecutor-";
        /**
         * @description: 实例化ThreadPoolTaskScheduler对象,用于创建ScheduledFuture<?> scheduledFuture
         */
        @Bean
        public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
            ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
            taskScheduler.setPoolSize(taskSchedulerCorePoolSize);
            taskScheduler.setThreadNamePrefix(threadNamePrefix);
            taskScheduler.setWaitForTasksToCompleteOnShutdown(false);
            taskScheduler.setAwaitTerminationSeconds(awaitTerminationSeconds);
            /**需要实例化线程*/
            taskScheduler.initialize();
    //        isinitialized = true;
            log.info("初始化ThreadPoolTaskScheduler ThreadNamePrefix=" + threadNamePrefix + ",PoolSize=" + taskSchedulerCorePoolSize
                    + ",awaitTerminationSeconds=" + awaitTerminationSeconds);
            return taskScheduler;
        }
        /**
         * @description: 实例化ThreadPoolTaskExecutor对象,管理线程
         */
        @Bean("asyncTaskExecutor")
        public Executor taskExecutor() {
            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setCorePoolSize(5);
            taskExecutor.setMaxPoolSize(50);
            taskExecutor.setQueueCapacity(200);
            taskExecutor.setKeepAliveSeconds(60);
            taskExecutor.setThreadNamePrefix("asyncTaskExecutor-");
            taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
            taskExecutor.setAwaitTerminationSeconds(60);
            //修改拒绝策略为使用当前线程执行
            taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            //初始化线程池
            taskExecutor.initialize();
            return taskExecutor;
        }
    }

    1.5 타이밍 Job

    DigitalEmpTask 만들기:

    rreee

    4, 결과 분석

    1 각각 두 개의 서비스 노드를 시작합니다. 구성은 다음과 같습니다:

    server:
    포트: 12105

    servlet:
    context-path: /automation-quartz-one

    server:

    포트: 12106

    서블릿 :
    컨텍스트 경로: /automation-quartz-two

    2. 작업 로그(스니펫)

    노드 자동화-쿼츠-원 작업 로그:
    2023-02-22 12:01:00.143 [taskExecutor -1] INFO <46>



    <46>


    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <
    <46><46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>

    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>
    <46>

    위 내용은 SpringBoot가 ShedLock을 통합하여 분산 예약 작업을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제