docs: def _preprocess(self, message_in, measurement):
          """Invoked at the start of execution, setting internal state,
          validating that the message should be processed and not dropped.
  
          :param message_in: The message to process
          :type message_in: :class:`rejected.data.Message`
          :param measurement: For collecting per-message instrumentation
          :type measurement: :class:`rejected.data.Measurement`
          :raises: rejected.errors.MessageException
          :raises: rejected.errors.DropMessage
  
          """
          self._clear()
          self._message = message_in
          self._measurement = measurement
  
          self._maybe_set_message_age()
  
          # Ensure there is a correlation ID
          self._correlation_id = (
                  self._message.properties.correlation_id or
                  self._message.properties.message_id or
                  str(uuid.uuid4()))
  
          # Set the Correlation ID for the connection for logging
          self._connections[self._message.connection].correlation_id = \
              self._correlation_id
  
          # Set the sentry context for the message type if set
          if self.message_type:
              self.set_sentry_context('type', self.message_type)
  
          # Validate the message type if validation is turned on
          if self._message_type:
              self._validate_message_type()
  
          # Check the number of ProcessingErrors and possibly drop the message
          if self._error_max_retry and _PROCESSING_EXCEPTIONS in self.headers:
              self._maybe_drop_message()