2012-10-06 2 views
1

이것은 숙제를위한 것입니다. 일반적으로 나는 cron을 사용하여 이런 식으로 할 것이지만 선생님은 정기적 인 간격으로 정보를 얻기 위해 서버를 폴링하는 작업 대기열을 생성하기를 원합니다.Google Appengine 작업을 반복적으로 만드는 방법은 무엇입니까?

은 지금까지 나는 이런 일이 :

Queue queue = QueueFactory.getDefaultQueue(); 
queue.add(
    withUrl("/MyPage"). 
    method(Method.GET). 
    param("user", viewModel.getUserId())); 

을하지만이 한 번만 실행됩니다. 어떻게 무제한 반복 할 수 있습니까?

+0

@Gwyn Howell 나는 cron을 사용하지 않는다고 특별히 말했습니다. 대기열을 반복하는 방법을 묻습니다. – ConditionRacer

+0

사과. 지연된 라이브러리를 보았습니까? https://developers.google.com/appengine/articles/deferred –

+0

빠른 검토를했습니다. 그것은 작업 대기열의 더 높은 추상화 인 것처럼 보입니다. 맞습니까? – ConditionRacer

답변

2

+0

좋은 생각, 나는 이것이 갈 길이라고 생각한다. 감사! – ConditionRacer

1

매우 유익한 방법으로 할 수 있습니다. RuntimeException로 태스크가 실패하면 자동으로 재시작됩니다. config를 사용하여 얼마나 반복하고 싶은지 관리 할 수 ​​있습니다. 자세한 내용은 https://developers.google.com/appengine/docs/java/config/queue을 확인하십시오. 그리고 추가 매개 변수가 필요하기 때문에 기본 대기열을 사용하지 않는 것이 중요합니다.

작업을 예약하는 것은 자연스러운 방법은 아니지만 문제가되지 않습니다.

당신은 대기열에 다른 작업을 추가하는 작업에서 실행되는 코드를 만들 수
+0

흠, 그래서 해커가 아닌 방법으로 작업을 반복 할 수 있습니까? – ConditionRacer

+0

그것은 해킹 방법이 아닙니다. 그러나 정기적 인 재시작이 아닙니다. DefferedTask를 사용하여 Exception을 던지기는 쉽지만 "/ MyPage"에 대해 200이 아닌 HTTP 코드를 반환 할 수 있습니다 –

+1

해커에 대한 정의가 같지 않다고 생각합니다.) 모든 것이 성공적으로 완료되면 예외를 throw합니다. 나에게 좋은 연습 같지 않아. – ConditionRacer

0

이 작업

private static class DeferredSubmitTask implements DeferredTask 
{ 
    @Override 
    public void run() 
    { 
     try 
     { 
      QueueFactory.getQueue("submitqueue").add(TaskOptions.Builder.withUrl("/tasks/submitworker").taskName("submit")); 
     } 
     catch (com.google.appengine.api.taskqueue.TaskAlreadyExistsException ex) 
     { 
      LOG.log(Level.INFO, "submit task launch failed, it is still running..."); 
     } 
    } 
} 

public static void deferSubmitTask(long countdownMillis) 
{ 
    QueueFactory.getDefaultQueue().add(TaskOptions.Builder.withPayload(new DeferredSubmitTask()).countdownMillis(countdownMillis)); 
} 
를 마무리 할 때 호출되는 DeferredTask

deferSubmitTask()와 함께 작업 자체를 다시 시작 할 수 있습니다

관련 문제