/** * Executes a background task. * * <p>The task payload is either type Deferrable or Key; in the latter case, retrieve (then * delete) the Deferrable instance from the datastore. */ @Override public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { try { Object payload = deserialize(req); if (payload instanceof Key) { // get Deferrable from datastore Blob taskBlob = (Blob) getDatastoreService().get((Key) payload).getProperty(TASK_PROPERTY); deleteEntity((Key) payload); if (taskBlob != null) { payload = deserialize(taskBlob.getBytes()); } } if (payload instanceof Deferrable) { ((Deferrable) payload).doTask(); } else if (payload != null) { log.severe("invalid payload type: " + payload.getClass().getName()); // don't retry task } } catch (EntityNotFoundException e) { log.severe(e.toString()); // don't retry task } catch (PermanentTaskFailure e) { log.severe(e.toString()); // don't retry task } }