code: def run_model(self, model_run, run_url):
          
          # Open connection to RabbitMQ server. Will raise an exception if the
          # server is not running. In this case we raise an EngineException to
          # allow caller to delete model run.
          try:
              credentials = pika.PlainCredentials(self.user, self.password)
              con = pika.BlockingConnection(pika.ConnectionParameters(
                  host=self.host,
                  port=self.port,
                  virtual_host=self.virtual_host,
                  credentials=credentials
              ))
              channel = con.channel()
              channel.queue_declare(queue=self.queue, durable=True)
          except pika.exceptions.AMQPError as ex:
              err_msg = str(ex)
              if err_msg == '':
                  err_msg = 'unable to connect to RabbitMQ: ' + self.user + '@'
                  err_msg += self.host + ':' + str(self.port)
                  err_msg += self.virtual_host + ' ' + self.queue
              raise EngineException(err_msg, 500)
          # Create model run request
          request = RequestFactory().get_request(model_run, run_url)
          # Send request
          channel.basic_publish(
              exchange='',
              routing_key=self.queue,
              body=json.dumps(request.to_dict()),
              properties=pika.BasicProperties(
                  delivery_mode = 2, # make message persistent
              )
          )
          con.close()
docs: Run model by sending message to RabbitMQ queue containing the
          run end experiment identifier. Messages are persistent to ensure that
          a worker will process process the run request at some point.
  
          Throws a EngineException if communication with the server fails.
  
          Parameters
          ----------
          model_run : ModelRunHandle
              Handle to model run
          run_url : string
              URL for model run information