Активировать сервлет Java из другого сервлета Java - PullRequest
0 голосов
/ 23 сентября 2010

Моя проблема заключается в следующем: Google App Engine позволяет заданиям cron быть активными только в течение 30 секунд, прежде чем выдается DeadlineExceededException .И мое приложение, которое не подходит для платформы Google App Engine с этой точки зрения, должно вызывать трудоемкую работу cron.Я решил, что одним из решений было вызвать другой сервлет (Servlet2) и позволить сервлету 2 выполнить эту работу за меня, Servlet_2 будет обычным сервлетом Java.Чтобы добиться этого, я думал о создании сеанса из моего задания cron Servlet_1, вызова другого Servlet_2, тестирования сеанса, а затем позволения серверу выполнить необходимые задания и в итоге сделать сеанс недействительным.Вызов из Servlet_1 не должен перенаправлять на Servlet_2, потому что это снова вернет меня на круги своя.Теперь на мой вопрос: как вы думаете, это будет работать?И если да и то, что будет DeadlineExceededException, то Servlet_2 также перестанет работать, даже если я добавлю весь код в метод уничтожения 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(); }

Буду благодарен за ответ!

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

У вас есть только 30 секунд, чтобы завершить выполнение, и нет пути к этому.Выполнение форварда не порождает новый поток или что-либо еще, оно все еще выполняется в течение 30 секунд.

Я бы попытался найти способ сериализации того, что вы делаете, или приостановить его ивставьте ваше состояние в memcache.Когда вы снова начнете обработку, проверьте memcache, чтобы узнать, нужно ли вам подобрать форму, в которой вы остановились.

Google App Engine работает над длительными фоновыми процессами, и я надеюсь, что вскоре появится решениеЯ в одной лодке.

Марк

1 голос
/ 24 сентября 2010

Почему бы не использовать очередь задач. Вы ставите задачу в очередь - она ​​работает в течение 29 секунд, а затем останавливается, но, прежде чем она останавливается, ставит в очередь другую задачу. Пока полезная нагрузка имеет маркер, указывающий, куда нужно перезапускать, у вас есть цепочка задач, которые могут выполняться столько, сколько вы хотите использовать (и платить за) процессор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...