code: func (payloadHandler *payloadRequestHandler) handleSingleMessage(payload *ecsacs.PayloadMessage) error {
  	if aws.StringValue(payload.MessageId) == "" {
  		seelog.Criticalf("Received a payload with no message id")
  		return fmt.Errorf("received a payload with no message id")
  	}
  	seelog.Debugf("Received payload message, message id: %s", aws.StringValue(payload.MessageId))
  	credentialsAcks, allTasksHandled := payloadHandler.addPayloadTasks(payload)
  	// save the state of tasks we know about after passing them to the task engine
  	err := payloadHandler.saver.Save()
  	if err != nil {
  		seelog.Errorf("Error saving state for payload message! err: %v, messageId: %s", err, aws.StringValue(payload.MessageId))
  		// Don't ack; maybe we can save it in the future.
  		return fmt.Errorf("error saving state for payload message, with messageId: %s", aws.StringValue(payload.MessageId))
  	}
  	if !allTasksHandled {
  		return fmt.Errorf("did not handle all tasks")
  	}
  
  	go func() {
  		// Throw the ack in async; it doesn't really matter all that much and this is blocking handling more tasks.
  		for _, credentialsAck := range credentialsAcks {
  			payloadHandler.refreshHandler.ackMessage(credentialsAck)
  		}
  		payloadHandler.ackRequest <- *payload.MessageId
  	}()
  
  	return nil
  }
docs: // handleSingleMessage processes a single payload message. It adds tasks in the message to the task engine
  // An error is returned if the message was not handled correctly. The error is being used only for testing
  // today. In the future, it could be used for doing more interesting things.