SpringBoot 2 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
주소
주소
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.