2012-04-29 2 views
4

Appengine은 java 멀티 스레딩을 허용하지 않으므로 어떻게 기존의 다중 스레드 코드를 플랫폼으로 마이그레이션 할 수 있습니까?() 무기한 반환 할 수있는 몇 가지 다른 프로세스를 포함 할 수있는 몇 가지 여러 레크리에이션/HTTP 호출을 수행Appengine을 사용한 멀티 스레딩

Thread t = new Thread() { 
     public boolean alive = true; 
     public void run() { 
      while (alive) { 
       try { 
        Thread.sleep(5000);  
        getNewNotifications(); 
       } catch (InterruptedException e) { 
        // Do nothing 
       } catch (IOException e) { 
       } 
      } 
     } 
    }; 
    t.start() 

함수 getNewNotification :

예를 들어 나는 다음과 같은 코드가 있습니다. 나는 Task Queue을 읽었지만이 간단한 코드를 어떻게 App Engine 친화적 인 코드로 변환합니까?

작업 대기열을 사용하여 위 코드를 구현하는 방법은 무엇입니까? 예를 들어, 매 5 초마다 getNewNotifications()으로 전화하십시오.

이 함수는 서버에서 결과를 얻고 결과를 구문 분석 한 다음 결과에 따라 수행해야하는 작업/작업을 실행합니다.

+0

Eelke의 백엔드 제안은 건전하지만, 폴링이 아니라 이벤트 중심으로 만들 수있는 방법이 있는지 고려해보십시오.수행해야 할 작업이있을 때만 물건을 사용하면 많은 자원을 절약 할 수 있습니다. –

답변

1

예산 (백엔드 결제 확인)에 따라 Scheduled Tasks을 사용하여이를 달성 할 수도 있습니다.

당신은 cron.xml 파일에서 작업을 지정합니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<cronentries> 
    <cron> 
    <url>/getNewNotifications</url> 
    <description>Get new notifications every 5 minutes</description> 
    <schedule>every 5 minutes</schedule> 
    </cron> 
</cronentries> 

은 물론, 당신은 서블릿 (또는 어떤 프레임 워크를 사용하는)이 URL /getNewNotifications에 매핑이 필요합니다.

또한 URL is secure (일반적으로 사용자가 해당 URL로 전화하는 것을 원하지 않음)을 확인해야합니다.

+0

나는 cron이 max에서 1 분만 작동한다는 것을 읽었습니다. 내가 "5 초마다"작동한다면 작동할까요? – xybrek

+0

참. 내 잘못이야. 몇 시간 또는 몇 분만 사용할 수 있습니다. –

2

backends에 관심이있을 수 있습니다. 백엔드는 백그라운드 스레드 (실험 기능)로 실행될 수 있으므로 이전처럼 사용자가 폴링하는 데 사용할 수 있습니다. 그러나 가능한 경우 작업을 사용하는 것이 더 효율적입니다. 알림이 앱의 다른 부분에서 오는 경우 알림을 만드는 대신 직접 작업을 만들 수 있습니다.

1

코드를 주기적으로 실행해야하므로 cron을 제안합니다.

서블릿의 get(..) 메소드 안에 코드를 입력하고 URL에 (web.xml을 통해) 매핑하고 cron이 주기적으로이 URL을 호출하도록 설정하십시오.

+0

그러나 cron 작업은 1 분 간격으로 최대 실행으로 제한됩니다. 5 초 간격이 필요합니다. – xybrek

5

자바 appengine에서 스레드를 만들 수 있습니다.

ThreadManager.createThreadForCurrentRequest (새 Runnable() {...}));

는 프론트 엔드 스레드가 중단되고 요청이 완료되면 사망하지만, 양산 백엔드 스레드가 한이 기뻐하는 한 실행됩니다 https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager

참조하십시오. InterruptedException을 잡을 때 아무것도하지 말고 시도하십시오. 이 예외를 삼키면 인스턴스가 온라인 상태로 유지 될 수 있으며 더 많은 비용이 들게됩니다.

코드를 Runnable 및 Task Queues와 함께 사용하려면 Runnable과 DeferredTask를 모두 구현하십시오. 두 인터페이스 모두 동일한 메소드 서명을가집니다. 지연 작업을 보내려면 QueueFactory.getQueue ("queueName")을 수행하십시오. add (TaskOptions.Builder.withPayload (YourDeferredTask));