1. 개요

이 예제에서는 JobRunr를 사용하여 Java에서 분산 백그라운드 작업 스케줄링 및 처리를 살펴보고 이를 Spring과 통합할 것입니다.

2. 잡런에 대해

JobRunr 은 애플리케이션에 포함할 수 있고 Java 8 람다를 사용하여 백그라운드 작업을 예약할 수 있는 라이브러리입니다. 인터페이스를 구현할 필요 없이 작업을 생성하기 위해 Spring 서비스의 기존 방법을 사용할 수 있습니다. 작업은 단기 또는 장기 실행 프로세스일 수 있으며 현재 웹 요청이 차단되지 않도록 자동으로 백그라운드 스레드로 오프로드됩니다.

작업을 수행하기 위해 JobRunr는 Java 8 람다를 분석합니다. JSON으로 직렬화하고 관계형 데이터베이스 또는 NoSQL 데이터 저장소에 저장합니다.

3. JobRunr 기능

너무 많은 백그라운드 작업을 생성하고 서버가 로드를 처리할 수 없는 경우 애플리케이션의 인스턴스를 추가하여 수평 으로 쉽게 확장 할 수 있습니다 . JobRunr는 자동으로 로드를 공유하고 애플리케이션의 다른 인스턴스에 모든 작업을 배포합니다.

또한 실패한 작업에 대한 지수 백오프 정책 이 있는 자동 재시도 기능 도 포함합니다 . 또한 모든 작업을 모니터링할 수 있는 대시보드내장 되어 있습니다. JobRunr는 자체 유지 관리됩니다. 성공한 작업은 구성 가능한 시간이 지나면 자동으로 삭제 되므로 수동 스토리지 정리를 수행할 필요가 없습니다.

4. 설정

단순화를 위해 메모리 내 데이터 저장소를 사용하여 모든 작업 관련 정보를 저장합니다.

4.1. 메이븐 구성

바로 자바 코드로 넘어갑시다. 하지만 그 전에 pom.xml 파일 다음 Maven 의존성을 선언 해야 합니다.

<dependency>
    <groupId>org.jobrunr</groupId>
    <artifactId>jobrunr-spring-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>

4.2. 스프링 통합

백그라운드 작업을 생성하는 방법으로 바로 넘어가기 전에 JobRunr를 초기화해야 합니다. 우리는 jobrunr-spring-boot-starter 의존성을 사용하고 있으므로 이것은 쉽습니다. application.properties에 몇 가지 속성만 추가하면 됩니다 .

org.jobrunr.background-job-server.enabled=true
org.jobrunr.dashboard.enabled=true

첫 번째 속성은 JobRunr에 작업 처리를 담당 하는 BackgroundJobServer 의 인스턴스를 시작하고 싶다고 알려줍니다 . 두 번째 속성은 JobRunr에 포함된 대시보드를 시작하도록 지시합니다.

기본적으로 jobrunr-spring-boot-starter모든 작업 관련 정보를 저장하기 위해 관계형 데이터베이스의 경우 기존 DataSource 를 사용하려고 시도합니다 .

그러나 메모리 내 데이터 저장소를 사용할 것이기 때문에 StorageProvider을 제공해야 합니다 .

@Bean
public StorageProvider storageProvider(JobMapper jobMapper) {
    InMemoryStorageProvider storageProvider = new InMemoryStorageProvider();
    storageProvider.setJobMapper(jobMapper);
    return storageProvider;
}

5. 사용법

이제 JobRunr를 사용하여 Spring에서 백그라운드 작업을 생성하고 예약하는 방법을 알아보겠습니다.

5.1. 의존성 주입

작업을 생성하려면 JobScheduler 와 작업을 생성하려는 메서드(이 경우 SampleJobService) 가 포함된 기존 Spring 서비스 를 주입해야 합니다 .

@Inject
private JobScheduler jobScheduler;

@Inject
private SampleJobService sampleJobService;

JobRunrJobScheduler 클래스를 사용하면 새 백그라운드 작업을 대기열에 넣거나 예약할 수 있습니다.

SampleJobService는 웹 요청에 처리하는 데 시간이 너무 오래 걸릴 수 있습니다 방법을 포함하는 기존의 Spring 서비스 중 하나가 될 수 있습니다. 또한 예외가 발생하면 JobRunr에서 메서드를 다시 시도하므로 탄력성을 추가하려는 다른 외부 서비스를 호출하는 메서드일 수도 있습니다.

5.2. 화재 후 망각 작업 생성

이제 의존성이 있으므로 enqueue 메서드를 사용하여 실행 후 잊어버리는 작업을 만들 수 있습니다 .

jobScheduler.enqueue(() -> sampleJobService.executeSampleJob());

작업은 다른 람다와 마찬가지로 매개변수를 가질 수 있습니다.

jobScheduler.enqueue(() -> sampleJobService.executeSampleJob("some string"));

이 줄은 유형, 메서드 및 인수를 포함한 람다가 영구 저장소(Oracle, Postgres, MySql 및 MariaDB와 같은 RDBMS 또는 NoSQL 데이터베이스)에 JSON으로 직렬화되도록 합니다.

그러면 모든 다른 BackgroundJobServer 에서 실행되는 스레드의 전용 작업자 풀이 이러한 대기 중인 백그라운드 작업을 선입선출 방식으로 최대한 빨리 실행합니다. JobRunr는 낙관적 잠금을 통해 단일 작업자의 작업 실행을 보장합니다.

5.3. 미래의 작업 일정 잡기

schedule 방법을 사용하여 미래에 작업을 예약할 수도 있습니다 .

jobScheduler.schedule(LocalDateTime.now().plusHours(5), () -> sampleJobService.executeSampleJob());

5.4. 반복적으로 작업 예약

반복 작업을 원하면 scheduleRecurrently 메서드 를 사용해야 합니다 .

jobScheduler.scheduleRecurrently(Cron.hourly(), () -> sampleJobService.executeSampleJob());

5.5. 와 어노테이션 @Job 어노테이션

작업의 모든 측면을 제어하기 위해 @Job 어노테이션으로 서비스 메서드에 어노테이션을 추가할 수 있습니다 . 이를 통해 대시보드에 표시 이름을 설정하고 작업이 실패할 경우 재시도 횟수를 구성할 수 있습니다.

@Job(name = "The sample job with variable %0", retries = 2)
public void executeSampleJob(String variable) {
    ...
}

String.format() 구문 을 통해 표시 이름으로 작업에 전달된 변수를 사용할 수도 있습니다 .

우리는 특정 예외에 특정 작업을 다시 시도 할 것입니다 매우 구체적인 사용 사례가있는 경우, 우리는 우리 자신의 쓸 수 ElectStateFilter을 우리가에 액세스 할 수있는 경우 작업 및 진행 방법에 대한 모든 권한을.

6. 대시보드

JobRunr에는 작업을 모니터링할 수 있는 대시보드가 ​​내장되어 있습니다. http://localhost:8000 에서 찾을 수 있고 모든 반복 작업을 포함하여 모든 작업을 검사할 수 있으며 대기열에 있는 모든 작업이 처리될 때까지 예상되는 시간을 확인할 수 있습니다.

예를 들어 SSL 인증서가 만료되거나 디스크가 가득 차는 등의 문제가 발생할 수 있습니다. 기본적으로 JobRunr는 지수 백오프 정책으로 백그라운드 작업을 다시 예약합니다. 백그라운드 작업이 계속해서 10번 실패하면 실패 상태가 됩니다. 그런 다음 근본 원인이 해결되면 실패한 작업을 다시 대기열에 추가하도록 결정할 수 있습니다.

정확한 오류 메시지가 포함된 각 재시도와 작업이 실패한 이유에 대한 전체 스택 추적을 포함하여 이 모든 것이 대시보드에 표시됩니다.

7. 결론

이 기사에서는 jobrunr-spring-boot-starter 와 함께 JobRunr를 사용하여 첫 번째 기본 스케줄러를 구축했습니다 . 이 예제의 핵심은 XML 기반 구성이나 인터페이스를 구현할 필요 없이 단 한 줄의 코드로 작업을 생성할 수 있다는 것입니다.

예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner