Java 8용 크론을 사용하여 태스크 예약(gcloud CLI 기반)

App Engine Cron Service를 사용하면 지정된 시간이나 주기적인 간격으로 작동하는 정기 예약 태스크를 구성할 수 있습니다. 이러한 태스크를 일반적으로 크론 작업이라고 합니다. 이러한 크론 작업은 App Engine Cron Service에 의해 자동으로 트리거됩니다. 예를 들어 크론 작업을 사용하여 일일 보고 이메일을 보내거나 10분마다 캐시된 일부 데이터를 업데이트하거나 매시간 요약 정보를 업데이트할 수 있습니다.

크론 작업은 크론 작업이 구성된 동일한 앱의 지정된 엔드포인트에 대해 예약된 HTTP GET 요청을 수행합니다. 이 엔드포인트의 핸들러는 호출 시 로직을 실행합니다.

App Engine Cron Service는 App Engine 호스트 앱 외부의 웹 엔드포인트를 호출하는 데 사용할 수 없습니다. 호스트 앱 이외의 다른 앱에서 App Engine 엔드포인트를 호출하는 데 사용할 수 없습니다.

크론 작업 요청에는 push 태스크 큐의 경우와 동일한 제한이 적용됩니다.

시작하기 전에

일정을 배포하거나 업데이트하려면 계정에 다음 IAM 역할 중 하나가 필요합니다.

  • 소유자
  • 편집자

Google Cloud 콘솔의 IAM 페이지에서 권한을 설정할 수 있습니다.

크론 작업 만들기

  1. 애플리케이션의 루트 디렉터리에 (app.yaml과 함께) cron.yaml 파일을 만듭니다.
  2. 파일에 하나 이상의 <cron> 항목을 추가하고 필수 <url><schedule> 요소를 포함하여 작업에 필요한 요소를 정의합니다. cron.yaml 파일의 요소에 대한 자세한 내용은 cron.yaml 문법 및 옵션을 검토하세요.

    다음은 매일 실행되는 기본 크론 작업을 만드는 예입니다.

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    타겟팅 사양은 선택사항이며 서비스/버전 이름입니다. 해당되는 경우 타겟이 앱의 호스트 이름 앞에 추가되어 작업 경로가 해당 서비스/버전으로 지정됩니다. 타겟을 지정하지 않으면 작업이 트래픽용으로 구성된 default 서비스의 버전에서 실행됩니다.

  3. 크론 작업 URL의 핸들러를 만듭니다. 이 핸들러는 예약하려는 모든 작업을 실행합니다. 핸들러는 200~299(경계 포함) 범위의 HTTP 상태 코드로 응답하여 성공을 표시합니다. 다른 상태 코드도 반환될 수 있으며 이 코드는 크론 작업을 다시 시도하는 데 사용됩니다.

핸들러는 앱의 서블릿처럼 간단합니다. web.xml의 서블릿 URL 매핑은 크론 작업 URL과 동일합니다.

개발 서버에서 크론 작업 테스트

로컬 개발 서버는 크론 작업을 자동으로 실행하지 않습니다. 기능을 테스트하도록 사용자가 크론 작업의 URL에 직접 요청할 수 있습니다. 로컬 크론 또는 예약된 태스크 인터페이스를 사용하여 curl 또는 유사한 도구로 작업의 URL을 트리거할 수 있습니다.

실패한 크론 작업 다시 시도

크론 작업의 요청 핸들러가 200~299(경계 포함) 범위를 벗어나는 상태 코드를 반환하면 App Engine은 작업이 실패한 것으로 간주합니다. 기본적으로 실패한 작업은 503 상태 코드가 반환되지 않는 한 다시 시도되지 않습니다. 503 상태 코드가 반환된 경우에는 성공하거나 200~299 상태 코드가 반환될 때까지 매분마다 실패한 작업이 다시 시도됩니다.

실패한 작업을 다시 시도하도록 설정하려면 다음 안내를 따르세요.

  1. cron.yaml 파일에 retry_parameters 블록을 포함합니다.
  2. retry_parameters 블록에서 retry 매개변수를 선택 및 설정합니다.

    예를 들어 이 샘플 cron.yaml 파일에는 재시도 횟수 최대 5회(기본값, 처음에는 2.5초로 시작하여 매회 두 배로 증가하는 백오프)로 구성된 단일 크론 작업이 있습니다.

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

크론 재시도 옵션에 대해 자세히 알아보기

크론 작업 배포

cron.yaml 구성 파일에 지정된 크론 작업을 배포하려면 다음 명령어를 실행합니다.

gcloud

gcloud app deploy cron.yaml

Maven

mvn appengine:deployCron cron.yaml

Gradle

gradle appengineDeployCron cron.yaml

IDE

IntelliJ 또는 Eclipse를 사용하는 경우 배포 양식을 사용하여 배포할 개별 구성 파일을 선택합니다.

모든 크론 작업 삭제

모든 크론 작업을 삭제하려면 다음 안내를 따르세요.

  1. cron.yaml 파일의 콘텐츠를 다음과 같이 수정합니다.

    cron:
    
  2. cron.yaml 파일을 App Engine에 배포합니다.

크론용 URL 보호

크론 핸들러는 app.yaml에 정의된 일반 핸들러에 지나지 않습니다. 관리자 계정에 대한 액세스를 제한하여 사용자가 예약된 태스크에서 사용되는 URL에 액세스하지 못하도록 할 수 있습니다. 예약된 태스크는 관리자 전용 URL에 액세스할 수 있습니다. app.yaml의 핸들러 구성에 login: admin을 추가하여 URL을 제한할 수 있습니다.

app.yaml에서의 예시는 다음과 같습니다.

application: hello-cron
version: 1
runtime: java
api_version: 1

handlers:
- url: /report/weekly
  servlet: mysite.server.CronServlet
  login: admin

크론 작업을 테스트하려면 관리자로 로그인하고 브라우저에서 핸들러 URL을 방문합니다.

Cron Service에서 보내는 요청에는 HTTP 헤더가 포함됩니다.

X-Appengine-Cron: true

X-Appengine-Cron 헤더는 App Engine에 의해 내부적으로 설정됩니다. 요청 핸들러가 이 헤더를 발견하면 요청이 크론 요청임을 신뢰할 수 있습니다. 앱에 대한 외부 사용자 요청에 있는 헤더는 삭제됩니다. 단, 테스트용으로 헤더를 설정할 수 있는 로그인한 애플리케이션 관리자의 요청인 경우에는 헤더가 삭제되지 않습니다.

App Engine은 IP 주소 0.1.0.2에서 크론 요청을 보냅니다. 이전 gcloud 버전(326.0.0 이전)으로 생성된 크론 작업의 경우 0.1.0.1에서 크론 요청이 발생합니다.

Google Cloud Endpoints 호출

크론 작업의 url 필드에는 Google Cloud Endpoint를 지정할 수 없습니다. 크론 작업이 Google Cloud Endpoint를 호출하도록 하려면 앱에서 핸들러가 제공하는 타겟으로 요청을 보내고 핸들러 코드에서 엔드포인트 클래스와 메서드를 호출합니다.

Google Cloud 콘솔에서 크론 작업 보기

Cloud SchedulerApp Engine 크론 작업 탭에서 예약된 크론 작업을 볼 수 있습니다.

로그를 확인하여 크론 작업이 추가되거나 삭제된 시기를 확인할 수도 있습니다.

자세히 알아보기

크론 작업 정의에 대한 자세한 내용은 cron.yaml 참조에서 확인하세요.