def initialize(self, request, response):
    """Initialize.

    1. call webapp init.
    2. check request is indeed from taskqueue.
    3. check the task has not been retried too many times.
    4. run handler specific processing logic.
    5. run error handling logic if precessing failed.

    Args:
      request: a webapp.Request instance.
      response: a webapp.Response instance.
    """
    super(TaskQueueHandler, self).initialize(request, response)

    # Check request is from taskqueue.
    if "X-AppEngine-QueueName" not in self.request.headers:
      logging.error(self.request.headers)
      logging.error("Task queue handler received non-task queue request")
      self.response.set_status(
          403, message="Task queue handler received non-task queue request")
      return

    # Check task has not been retried too many times.
    if self.task_retry_count() + 1 > parameters.config.TASK_MAX_ATTEMPTS:
      logging.error(
          "Task %s has been attempted %s times. Dropping it permanently.",
          self.request.headers["X-AppEngine-TaskName"],
          self.task_retry_count() + 1)
      self._drop_gracefully()
      return

    try:
      self._preprocess()
      self._preprocess_success = True
    # pylint: disable=bare-except
    except:
      self._preprocess_success = False
      logging.error(
          "Preprocess task %s failed. Dropping it permanently.",
          self.request.headers["X-AppEngine-TaskName"])
      self._drop_gracefully()