docs: def amqp_publish(self, exchange, routing_key, body, properties=None):
          """Publish a message to RabbitMQ
  
          :param str exchange: The exchange to publish the message to
          :param str routing_key: The routing key to publish the message with
          :param bytes body: The message body to send
          :param dict properties: An optional dict of AMQP properties
          :rtype: tornado.concurrent.Future
  
          :raises: :exc:`sprockets.mixins.amqp.AMQPError`
          :raises: :exc:`sprockets.mixins.amqp.NotReadyError`
          :raises: :exc:`sprockets.mixins.amqp.PublishingError`
  
          """
          properties = properties or {}
          if hasattr(self, 'correlation_id') and getattr(self, 'correlation_id'):
              properties.setdefault('correlation_id', self.correlation_id)
          return self.application.amqp.publish(
              exchange, routing_key, body, properties)