2010-09-23 141 views
0

我的問題是:
Google App Engine允許cron作業在拋出DeadlineExceededException之前只有30秒激活。從這個角度來看,我的應用程序不適合Google應用程序引擎平臺,因此需要調用耗時的cron作業。
我想到的一個解決方案是調用另一個Servlet(Servlet2)並讓該Servlet2爲我完成這個工作,Servlet_2將是一個常規的Java Servlet。
爲了達到這個目的,我正在考慮從我的cron作業Servlet_1中創建一個session,調用另一個Servlet_2,測試會話,然後讓服務器完成所需的工作並最終使會話失效。
來自Servlet_1的調用不應該重定向到Servlet_2,因爲這會再次讓我回到方方面面。
現在我的問題:你認爲這會工作?如果是,並且DeadlineExceededException acure,那麼即使我將所有代碼放在Servlet_2的destroy方法中,Servlet_2是否也會停止工作?
我的代碼: 從另一個Java Servlet中激活一個Java Servlet

 
//Servlet_1 
try { 
    HttpSession session = request.getSession(true); 
    session.setAttribute("referingPage", "server is calling"); 
    request.getRequestDispatcher("/Servlet_2.do").forward(request, response); 
}catch(DeadlineExceededException e) { 
    e.printStackTrace(); 
} 
 
//Servlet_2 
@Override 
public void destroy() { 
    HttpSession session = request.getSession(true); 
    String value = (String)session.getAttribute("referringPage"); 
    if(value.equals("server is calling")) { 
    // Do the time demanding stuff 
    } 
    session.invalidate(); 
} 

將是一個答案感謝!

回答

1

您只有30秒的時間來完成執行,並且沒有辦法解決這個問題。做前進不會產生新的線程或任何東西,它仍然在30秒內執行。

我試圖找出一些方法來序列化你在做什麼,或暫停它,並堅持你的狀態在memcache中。當您再次開始處理時,請檢查memcache以查看是否需要從停止的位置獲取表單。

Google App Engine正在處理長時間運行的後臺進程,我希望很快就能找到解決方案。我在同一條船上。

馬克

1

爲什麼不使用任務隊列。你在隊列上放置一個任務 - 它工作了29秒,然後停止,但是在它停止之前,它將另一個任務放到隊列中。只要有效載荷有一個指示重啓位置的標記,那麼只要你想要消耗(並支付)CPU,就可以運行一組鏈接的任務。

相關問題