SpringBoot 2 ElasticJob 프레임 워 크 통합 과정 상세 설명

1.ElasticJob
간단 한 소개
1.정시 퀘 스 트
앞의 글 에서 QuartJob 이라는 정시 임 무 는 광범 위 하 게 응용 되 는 정시 임무 기준 이 라 고 말 했다.그러나 Quartz 의 핵심 점 은 정시 임 무 를 수행 하 는 것 이 주목 하 는 업무 모델 과 장면 이 아니 라 고도 의 사용자 정의 기능 이 부족 하 다 는 것 이다.Quartz 는 데이터 베 이 스 를 기반 으로 임 무 를 수행 할 수 있 지만 분포 식 병행 스케줄 링 기능 을 갖 추 지 못 합 니 다.
->QuartJob 정시 퀘 스 트
2,ElasticJob 설명 기초 안내
Elastic-Job 은 서로 독립 된 두 개의 하위 프로젝트 인 Elastic-Job-Lite 와 Elastic-Job-Cloud 로 구 성 된 오픈 소스 의 분포 식 스케줄 링 미들웨어 입 니 다.Elastic-Job-Lite 는 경량급 무 중심 화 솔 루 션 으로 jar 패키지 로 분포 식 작업 의 스케줄 링 과 관 리 를 제공 합 니 다.Elastic-Job-Cloud 는 Mesos Framework 로 Mesos 를 바탕 으로 자원 관리,응용 배포 와 프로 세 스 격 리 등 서 비 스 를 추가 로 제공 합 니 다.
기능 특징
  • 분포 식 스케줄 링
  • 조화 탄성 확장 용량
  • 실효 이전
  • 집행 을 놓치다
  • 작업 재 트리거 작업 분 편 일치 성 을 확보 하고 같은 분 편 이 분포 식 환경 에서 하나의 실행 사례 만
  • 보 도:남 의 홈 페이지 에서 이렇게 묘 사 했 는데 여기 서 다시 한 번 말씀 드 리 고 글 을 채 워 주세요.
    기초 구조
    이 사진 은 ElasticJob 홈 페이지 에서 나 왔 다.

    그림 에서 다음 과 같은 내용 을 알 수 있다.
    Zookeeper 구성 요소 의 지원 이 필요 합 니 다.분포 식 스케줄 링 임무 로 서 좋 은 감청 체제 와 콘 솔 이 있 고 다음 사례 도 이 그림 을 참조 하 십시오.
    3.분할 관리
    이 개념 은 ElasticJob 에서 가장 특징 적 이 고 실용성 이 좋다.
    블록 버스터 개념
    작업 의 분포 식 실행 은 하나의 작업 을 여러 개의 독립 된 작업 항목 으로 나 눈 다음 분포 식 서버 에서 각각 하나 또는 몇 개의 분할 항목 을 실행 해 야 합 니 다.
    장면 설명:서비스 3 대,3 편 으로 나 누 어 관리 하고 데이터 시트 100 개 를 처리 해 야 한다 고 가정 하면 100%3 이 되 고 나머지 0,1,2 에 따라 3 대 서비스 에 분산 되 어 집행 할 수 있다.여기 서 라 이브 러 리 분 표 의 기본 논리 가 샘 솟 는 것 을 보면 왜 많은 큰 소 들 이 프로 그래 밍 사고 가 중요 하 다 고 말 하 는 지 알 수 있다.
    개성 화 된 매개 변수
    개성 화 된 매개 변 수 는 shardingItemParameter 로 분할 항목 과 대응 하 는 관 계 를 일치 시 켜 분할 항목 의 숫자 를 더욱 읽 을 수 있 는 업무 코드 로 변환 할 수 있 습 니 다.
    장면 묘사:여기 서 갑자기 읽 으 면 매우 하늘하늘 한 것 같 습 니 다.사실은 이런 뜻 입 니 다.만약 에 3 편 으로 나 누 어[0,1,2]가 예 쁘 지 않 거나 표지 가 좋 지 않 으 면 각각 별명 표 지 를 줄 수 있 습 니 다.[0=A,1=B,2=C].
    2.정시 퀘 스 트 로드
    1.핵심 의존 팩
    2.0+버 전 을 사용 합 니 다.
    
    <dependency>
      <groupId>com.dangdang</groupId>
      <artifactId>elastic-job-lite-core</www.lanboylsy.com artifactId>
      <version>2.1.5</version>
    </dependency>
    <dependency>
      <groupId>com.dangdang<www.yuanyangyul.com /groupId>
      <artifactId>elastic-job-lite-spring<www.lexuancaizc.cn /artifactId>
      <version>2.1.5</version>
    </dependency>
    2.핵심 프로필
    여 기 는 주로 Zookeeper 미들웨어,분 편 과 분 편 인 자 를 설정 합 니 다.
    
    zookeeper:
     server: 127.0.0.1:2181
     namespace: es-job
    job-config:
     cron: 0/10 * * * * ?
     shardCount: 1
     shardItem: 0=A,1=B,2=shentuylzc.cn C,3www.yongxinylzn.cn=D
    3.사용자 정의 주석
    공식 적 인 사례 를 보고 좋 은 주 해 를 보지 못 했 습 니 다.여 기 는 사례 를 바탕 으로 하 는 로드 과정 과 핵심 API 를 참고 로 만 들 수 있 습 니 다.
    핵심 설정 클래스:com.dangdang.ddframe.job.lite.config.LiteJobConfiguration주 해 를 어떻게 사용 하고 싶 은 지 에 따라 예 를 들 어 저 는 정시 작업 이름과 Cron 표현 식 이라는 두 가지 기능 만 설명 하고 싶 습 니 다.다른 매개 변 수 는 직접 통일 적 으로 설정 합 니 다.(여 기 는 QuartJob 의 영향 을 너무 많이 받 아서 근본적으로 편리 하 게 하려 고 할 수도 있 습 니 다.)
    
    @Inherited
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TaskJobSign www.zhuyngyule.cn{
    
      @AliasFor("cron"www.feiyuptzc.cn)
      String value(www.yinmao2zhuce.cn) default "";
    
      @AliasFor("value")
      String cron(www.wujiu5zhuce.cn) default "";
    
      String jobName(www.shengyunyule.cn) default "";
    
    }
    4.작업 사례
    여기에 기본 적 인 파 라 메 터 를 인쇄 하여 설정 과 주 해 를 대조 하여 한눈 에 알 수 있 습 니 다.
    
    @Component
    @TaskJobSign(cron = www.anxing4zc.cn"0/5 * * * * ?",jobName =www.jucaiyle.cn "Hello-Job")
    public class HelloJob implements SimpleJob {
    
      private static final Logger LOG = LoggerFactory.getLogger(HelloJob.class.getName()) ;
    
      @Override
      public void execute(ShardingContext shardingContext) {
        LOG.info("    : "+Thread.currentThread().getId());
        LOG.info("    :"+shardingContext.getShardingTotalCount());
        LOG.info("    :"+shardingContext.getShardingItem());
        LOG.info("    :"+shardingContext.getShardingParameter());
        LOG.info("    :"+shardingContext.getJobParameter());
      }
    }
    5.로 딩 정시 퀘 스 트
    사용자 정의 주석 이 있 으 면 불 러 오 는 과정 도 자 연 스 럽 게 사용자 정의 주석 을 읽 고 설정 화 하 며 용 기 를 넣 고 초기 화 하 며 작업 이 실 행 될 때 까지 기다 리 면 됩 니 다.
    
    @Configuration
    public class ElasticJobConfig {
    
      @Resource
      private ApplicationContext applicationContext ;
      @Resource
      private ZookeeperRegistryCenter zookeeperRegistryCenter;
    
      @Value("${job-config.cron}") private String cron ;
      @Value("${job-config.shardCount}"www.jucaiylzc.cn) private int shardCount ;
      @Value("${job-config.shardItem}") private String shardItem ;
      
      /**
       *        
       */
      @Bean
      public ElasticJobListener elasticJobListener() {
        return new TaskJobListener();
      }
      /**
       *        
       */
      @PostConstruct
      public void initTaskJob() {
        Map<String, SimpleJob> jobMap = this.applicationContext.getBeansOfType(SimpleJob.class);
        Iterator iterator = jobMap.entrySet().iterator();
        while (iterator.hasNext()) {
          //        
          Map.Entry<String, SimpleJob> entry = (Map.Entry)iterator.next();
          SimpleJob simpleJob = entry.getValue();
          TaskJobSign taskJobSign = simpleJob.getClass().getAnnotation(TaskJobSign.class);
          if (taskJobSign != null){
            String cron = taskJobSign.cron() ;
            String jobName = taskJobSign.jobName() ;
            //     
            SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(
                            JobCoreConfiguration.newBuilder(jobName, cron, shardCount)
                            .shardingItemParameters(shardItem).jobParameter(jobName).build(),
                            simpleJob.getClass().getCanonicalName());
            LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(
                            simpleJobConfiguration).overwrite(true).build();
            TaskJobListener taskJobListener = new TaskJobListener();
            //      
            SpringJobScheduler jobScheduler = new SpringJobScheduler(
                            simpleJob, zookeeperRegistryCenter,
                            liteJobConfiguration, taskJobListener);
            jobScheduler.init();
          }
        }
      }
    }
    이 API 들 이 어떻게 알 고 있 는 지 의문 하지 마 세 요.공식 문서 의 사례 를 보 세 요.그들 이 이 핵심 API 를 어떻게 사용 하 는 지 여 기 는 그대로 쓰 는 것 입 니 다.바로 주석 류 의 로드 과정 을 한 단계 더 정의 하 는 것 입 니 다.물론 공식 문 서 를 대충 읽 어 보 는 것 도 필요 하 다.
    한 마디:일부 구성 요소 의 용법 을 어떻게 빨리 배 우 는 지,먼저 공식 문 서 를 찾 거나 소스 라 이브 러 리 위 키 를 열 고 ReadMe 문 서 를 사용 하지 않 습 니 다(없 으 면 포기 하고 다른 것 을 찾 습 니 다).기본 기능 이 자신의 수요 에 부합 되 는 지 잘 알 고 있 습 니 다.부합 되면 기본 적 인 용법 사례 를 보고 API 를 잘 알 고 마지막 으로 자신 이 필요 로 하 는 기능 모듈 을 연구 하 는 것 입 니 다.개인 적 인 경험 으로 볼 때 이 과정 은 굽 은 길이 가장 적 고 구덩이 가 가장 적다.
    6.임무 감청
    사용법 이 매우 간단 하여 ElasticJobListener 인 터 페 이 스 를 실현 합 니 다.
    
    @Component
    public class TaskJobListener implements ElasticJobListener {
      private static final Logger LOG = LoggerFactory.getLogger(TaskJobListener.class);
    
      private long beginTime = 0;
    
      @Override
      public void beforeJobExecuted(ShardingContexts shardingContexts) {
        beginTime = System.currentTimeMillis();
        LOG.info(shardingContexts.getJobName()+"===>  ...");
      }
    
      @Override
      public void afterJobExecuted(ShardingContexts shardingContexts) {
        long endTime = System.currentTimeMillis();
        LOG.info(shardingContexts.getJobName()+
        "===>  ...[  :"+(endTime - beginTime)+"]");
      }
    }
    한 마디:before 와 after 의 집행 전후,중간 에 목표 방법 을 집행 하고 표준 적 인 AOP 절단면 사상 을 수행 하기 때문에 밑바닥 수준 은 상부 구조 에 대한 이해 속 도 를 결정 한다.그 의 먼지 는 닦 아야 하지 않 겠 는가?
    동적 추가
    1.작업 임무
    일부 장면 은 동적 으로 시간 임 무 를 추가 하고 관리 해 야 하 며 위의 로드 절 차 를 바탕 으로 일부 절 차 를 사용자 정의 하면 된다.
    
    @Component
    public class GetTimeJob implements SimpleJob {
    
      private static final Logger LOG = LoggerFactory.getLogger(GetTimeJob.class.getName()) ;
    
      private static final SimpleDateFormat format =
          new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
    
      @Override
      public void execute(ShardingContext shardingContext) {
        LOG.info("Job Name:"+shardingContext.getJobName());
        LOG.info("Local Time:"+format.format(new Date()));
      }
    }
    2.퀘 스 트 서비스 추가
    위 에 있 는 작업 을 동적 으로 추가 합 니 다.
    
    @Service
    public class TaskJobService {
    
      @Resource
      private ZookeeperRegistryCenter zookeeperRegistryCenter;
    
      public void addTaskJob(final String jobName,final SimpleJob simpleJob,
                  final String cron,final int shardCount,final String shardItem) {
        //     
        JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(
                              jobName, cron, shardCount)
                              .shardingItemParameters(shardItem).build();
        JobTypeConfiguration jobTypeConfiguration = new SimpleJobConfiguration(jobCoreConfiguration,
                              simpleJob.getClass().getCanonicalName());
        LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(
                              jobTypeConfiguration).overwrite(true).build();
        TaskJobListener taskJobListener = new TaskJobListener();
        //     
        SpringJobScheduler jobScheduler = new SpringJobScheduler(
            simpleJob, zookeeperRegistryCenter,
            liteJobConfiguration, taskJobListener);
        jobScheduler.init();
      }
    
    }
    칼 한 마디:여기에 추 가 된 후에 작업 은 정시 에 실 행 됩 니 다.작업 을 어떻게 멈 추 느 냐 가 또 하나의 문제 입 니 다.작업 이름 에 설정 을 할 수 있 습 니 다.예 를 들 어 데이터 베이스 에 기록[1,job 1,state]을 만 들 고 state 가 정지 상태 인 작업 으로 예약 하면 바로 수염 을 자 르 면 됩 니 다.
    3.테스트 인터페이스
    
    @RestController
    public class TaskJobController {
    
      @Resource
      private TaskJobService taskJobService ;
    
      @RequestMapping("/addJob")
      public String addJob(@RequestParam("cron") String cron,@RequestParam("jobName") String jobName,
                 @RequestParam("shardCount") Integer shardCount,
                 @RequestParam("shardItem") String shardItem) {
        taskJobService.addTaskJob(jobName, new GetTimeJob(), cron, shardCount, shardItem);
        return "success";
      }
    }
    소스 코드 주소
    GitHub
    주소
    주소
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기