/** * Copyright 2015 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.taskqueue; import com.google.appengine.api.taskqueue.TaskOptions; import com.google.appengine.api.taskqueue.Queue; import com.google.appengine.api.taskqueue.QueueFactory; import com.google.appengine.api.taskqueue.TaskHandle; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.List; import java.util.logging.Logger; import java.util.concurrent.TimeUnit; /** * Form Handling Servlet * This servlet has one method * {@link #doPost(<#HttpServletRequest req#>, <#HttpServletResponse resp#>)} which takes the form * submisson from /src/main/webapp/tasks.jsp to add and delete tasks. */ public class TaskqueueServlet extends HttpServlet { private static final Logger log = Logger.getLogger(TaskqueueServlet.class.getName()); private static final int numberOfTasksToAdd = 100; private static final int numberOfTasksToLease = 100; private static boolean useTaggedTasks = true; private static String output; private static String message; // Process the http POST of the form @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { if (req.getParameter("addTask") != null) { String content = req.getParameter("content"); String output = String.format("Adding %d Tasks to the Task Queue with a payload of '%s'", numberOfTasksToAdd, content.toString()); log.info(output.toString()); // Add Tasks to Task Queue // [START get_queue] Queue q = QueueFactory.getQueue("pull-queue"); // [END get_queue] if (!useTaggedTasks) { for (int i = 0; i < numberOfTasksToAdd; i++) { // [START add_task] q.add(TaskOptions.Builder.withMethod(TaskOptions.Method.PULL) .payload(content.toString())); // [END add_task] } } else { for (int i = 0; i < numberOfTasksToAdd; i++) { // [START add_task_w_tag] q.add(TaskOptions.Builder.withMethod(TaskOptions.Method.PULL) .payload(content.toString()) .tag("process".getBytes())); // [END add_task_w_tag] } } try { message = "Added " + numberOfTasksToAdd + " tasks to the task queue."; req.setAttribute("message", message); req.getRequestDispatcher("tasks.jsp").forward(req,resp); } catch (ServletException e) { throw new ServletException("ServletException error: ", e); } } else if (req.getParameter("leaseTask") != null) { output = String.format("Pulling %d Tasks from the Task Queue", numberOfTasksToLease); log.info(output.toString()); // Pull tasks from the Task Queue and process them Queue q = QueueFactory.getQueue("pull-queue"); if (!useTaggedTasks) { // [START lease_tasks] List<TaskHandle> tasks = q.leaseTasks(3600, TimeUnit.SECONDS, numberOfTasksToLease); // [END lease_tasks] message = processTasks(tasks, q); } else { // [START lease_tasks_by_tag] // Lease only tasks tagged with "process" List<TaskHandle> tasks = q.leaseTasksByTag(3600, TimeUnit.SECONDS, numberOfTasksToLease, "process"); // You can also specify a tag to lease via LeaseOptions passed to leaseTasks. // [END lease_tasks_by_tag] message = processTasks(tasks, q); } req.setAttribute("message", message); req.getRequestDispatcher("tasks.jsp").forward(req,resp); } else { resp.sendRedirect("/"); } } //Method to process and delete tasks private static String processTasks(List<TaskHandle> tasks, Queue q) { String payload; int numberOfDeletedTasks = 0; for (TaskHandle task : tasks) { payload = new String(task.getPayload()); output = String.format("Processing: taskName='%s' payload='%s'", task.getName() .toString(), payload.toString()); log.info(output.toString()); output = String.format("Deleting taskName='%s'", task.getName().toString()); log.info(output.toString()); // [START delete_task] q.deleteTask(task); // [END delete_task] numberOfDeletedTasks++; } if (numberOfDeletedTasks > 0) { message = "Processed and deleted " + numberOfTasksToLease + " tasks from the " + " task queue."; } else { message = "Task Queue has no tasks available for lease."; } return message; } }