본문 바로가기

Cloud Platform/Google Cloud Platform

Google App Engine + Cron (Spring Scheduler)

Google App Engine 에서는 Spring Scheduler 를 지원하지 않았다. 에러 내용을 남기지 못했는데

스레드를 생성할 권한이 없다는 취지의 에러 였다.

Google App Engine 은 파일 시스템 액세스나 스레드 관련해서는 허용 하지 않는다.

대신에 대처할 수 있는 여러 서비스가 존재 한다.

Google Cloud Platform 의 하위 서비스로 Google App Engine 과 Cloud SQL 이 존재 하듯이

Google Cloud Platform 문서 나 구글 검색을 해보면 답을 얻을 수 있다.

따라서, Spring Scheduler 를 대신 하기 위해서는 아래의 문서를 참조 할것.


https://cloud.google.com/appengine/docs/flexible/java/scheduling-jobs-with-cron-yaml#the_schedule_format


처음엔 cron.xml (https://cloud.google.com/appengine/docs/java/config/cron) 기반의 설정 문서로 작업을 했는데 아무리 문서를 따라해도 스케줄 작업이 등록이 안되는 것임. ㅡㅡ;


그래서 위 cron.yaml 문서의 내용대로 처리를 하니 

console.cloud.google.com -> App Engine -> 작업 대기열 -> 크론 작업   에 등록이 되었다.



다음은 정상 등록되는 과정이다.


1. 기존 스프링 스케줄 @Scheduled annotation 삭제

ex) @Scheduled(cron = "0 0 2 * * *") annotation 을 제외한다.


2. cron.yaml 생성

cron:

- description: "Get Info From YouTubeApi Cron Job"    # 설명

  url: /schedule/get/from/youtube/api/                       # 해당 스케줄 핸들러 

  schedule: every day 03:00                                       # 메일 새벽 3시

  timezone: Asia/Seoul                                             # timezone 은 서울


3. 해당 스케줄 핸들러(컨트롤러) 작성

3.1 해당 RequestMapping 컨트롤러 작성 완료

3.2 maven plug-in 으로 gcloud-sdk 를 사용중이므로 

3.3 구글 서버로 배포하기 (소스)

3.3.1 소스 배포 : cmd 창을 열고 프로젝트의 pom.xml 위치로 이동해서 mvn appengine:deploy

3.3.2 소스 배포 : 이클립스 에서는 프로젝트 -> Run As -> Run Configuration -> Maven Build -> new

3.3.2.1 Name 은 적절한걸로

3.3.2.2 Base directory 는 ${project_loc}

3.3.2.3 Goals 는 appengine:deploy 작성 후 저장

3.3.2.4 이후에는 프로젝트 -> Run As -> Maven Build 해서 신규 생성한 빌드를 선택하면 서버로 배포 시작함.

3.4 구글 서버로 배포하기 (cron.yaml)

3.4.1 cmd 창을 열고 프로젝트의 \webapp\WEB-INF\cron.yaml 위치로 이동해서 gcloud app deploy cron.yaml

3.4.2 console.cloud.google.com -> App Engine -> 작업 대기열 -> 크론 작업 에 등록되면 

 cron.yaml 의 description 내용으로 목록에 나타난다.

3.4.3 "지금실행" 으로 실행여부 지켜보고 오류 있는지 "로그" 클릭해서 인스턴스 로그를 확인해본다.