Очередь задач Google App Engine в GWT
Я смотрю на новый API очереди задач Google App Engine для Java, и мне трудно связать это с моим GWT-приложением. Если я хотел использовать очередь задач для выполнения некоторой асинхронной обработки, как мне это сделать, используя GWT.
На мой взгляд, мне нужно отправить запрос на сервер, который затем отправит запрос в API очереди задач. Если я правильно понимаю очереди задач, мне придется создать еще один сервлет, чтобы выполнять обработку из очереди задач (будь рабочим).
Я ищу 2 вещи:
- Будет ли работник сервлетом (т.е. расширяет
HttpServlet
)? Если нет, может ли кто-нибудь привести мне пример "работника"? - Имеет ли смысл использовать очередь задач, если я просто хочу отправить асинхронный ответ для немедленного выполнения? Кажется, достаточно встроенного в GWT механизма RPC.
2 ответа
Да, работник будет сервлетом, который может обрабатывать запрос с параметрами POST. Если вы хотите асинхронный вызов с точки зрения клиента, тогда достаточно RPC (с точки зрения сервера, он все еще является синхронным). Если вы хотите выполнять "отложенные" задания, которые не взаимодействуют с вашим клиентом, вы можете использовать очередь задач.
Есть ли какие-либо планы для deferred.defer в Java?
import static com.google.appengine.api.labs.taskqueue.TaskOptions.Builder.taskName;
import java.io.IOException;
import javax.servlet.ServletException;
import com.newatlanta.appengine.taskqueue.Deferred;
import com.newatlanta.appengine.taskqueue.Deferred.Deferrable;
@SuppressWarnings("serial")
public class SampleTask implements Deferrable {
private String arg1;
private String arg2;
public SampleTask() {
}
public SampleTask(String arg1, String arg2) {
// save information to use later
this.arg1 = arg1;
this.arg2 = arg2;
}
@Override
public void doTask() throws ServletException, IOException {
// TODO do work here
// this is how you 'schedule' a task
// doing this here is recursive;
// you most likely want to call this from
// a server rpc endpoint
SampleTask task = new SampleTask("arg1", "arg2");
Deferred.defer(task, "queue-name", taskName("task-name"));
}
}