繁体   English   中英

从另一个Java Servlet激活Java Servlet

[英]Activate a Java Servlet from another Java Servlet

我的问题是:
在抛出DeadlineExceededException之前, Google App Engine仅允许cron作业激活30秒。 从这个角度来看,我的应用不适合google app引擎平台,需要调用一项耗时的cron作业。
我想到的一个解决方案是调用另一个Servlet(Servlet2),然后让Servlet2为我完成工作,Servlet_2将是常规的Java Servlet。
为此,我正在考虑从我的cron作业Servlet_1创建一个会话 ,调用另一个Servlet_2,测试该会话,然后让服务器执行所需的作业,最后使该会话无效。
来自Servlet_1的调用不应重定向到Servlet_2,因为那样会使我再次回到第一方。
现在我的问题是:您认为这行得通吗? 如果可以,并且即使DeadlineExceededException可以实现,那么即使我将所有代码都放在Servlet_2的destroy方法中,Servlet_2也会停止工作吗?
我的代码:


//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(); } 

将不胜感激!

为什么不使用任务队列。 您将一个任务放在队列中-它会工作29秒,然后停止,但是在停止之前,它将另一个任务放在队列中。 只要负载有一个标记来指示从何处重新启动,那么您就可以拥有一组链接的任务,这些任务可以持续运行很长时间,只要您要消耗(并为之付费)CPU。

您只有30秒的时间来完成执行,因此无法解决。 进行转发不会产生新线程或其他任何东西,它仍会在30秒的时间限制内执行。

我会尝试找出一些方法来序列化您正在做的事情,或者暂停它,并将您的状态保留在内存缓存中。 当您再次开始处理时,请检查内存缓存以查看是否需要从上次中断的地方领取表格。

Google App Engine正在运行长期运行的后台程序,希望不久以后能提出解决方案。 我在同一条船上。

标记

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM