<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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)