code: async def publish(self,
                        exchange: str,
                        routing: str,
                        message: Union[str, dict],
                        exchange_type: ExchangeType_ = 'topic'):
          
          try:
              await self._ensure_channel()
          except Exception:
              # If server has restarted since our last attempt, ensure channel will fail (old connection invalid)
              # Retry once to check whether a new connection can be made
              await self._ensure_channel()
  
          # json.dumps() also correctly handles strings
          data = json.dumps(message).encode()
  
          await self._channel.exchange_declare(
              exchange_name=exchange,
              type_name=exchange_type,
              auto_delete=True
          )
  
          await self._channel.basic_publish(
              payload=data,
              exchange_name=exchange,
              routing_key=routing
          )
docs: Publish a new event message.
  
          Connections are created automatically when calling `publish()`,
          and will attempt to reconnect if connection was lost.
  
          For more information on publishing AMQP messages,
          see https://www.rabbitmq.com/tutorials/tutorial-three-python.html
  
          Args:
              exchange (str):
                  The AMQP message exchange to publish the message to.
                  A new exchange will be created if it does not yet exist.
  
              routing (str):
                  The routing identification with which the message should be published.
                  Subscribers use routing information for fine-grained filtering.
                  Routing can be expressed as a '.'-separated path.
  
              message (Union[str, dict]):
                  The message body. It will be serialized before transmission.
  
              exchange_type (ExchangeType_, optional):
                  When publishing to a previously undeclared exchange, it will be created.
                  `exchange_type` defines how the exchange distributes messages between subscribers.
                  The default is 'topic', and acceptable values are: 'topic', 'direct', or 'fanout'.
  
          Raises:
              aioamqp.exceptions.AioamqpException:
                  * Failed to connect to AMQP host
                  * Failed to send message
                  * `exchange` already exists, but has a different `exchange_type`