docs: def send_request(
          self,
          service_name,
          actions,
          switches=None,
          correlation_id=None,
          continue_on_error=False,
          context=None,
          control_extra=None,
          message_expiry_in_seconds=None,
          suppress_response=False,
      ):
          """
          Build and send a JobRequest, and return a request ID.
  
          The context and control_extra arguments may be used to include extra values in the
          context and control headers, respectively.
  
          :param service_name: The name of the service from which to receive responses
          :type service_name: union[str, unicode]
          :param actions: A list of `ActionRequest` objects
          :type actions: list
          :param switches: A list of switch value integers
          :type switches: union[list, set]
          :param correlation_id: The request correlation ID
          :type correlation_id: union[str, unicode]
          :param continue_on_error: Whether to continue executing further actions once one action has returned errors
          :type continue_on_error: bool
          :param context: A dictionary of extra values to include in the context header
          :type context: dict
          :param control_extra: A dictionary of extra values to include in the control header
          :type control_extra: dict
          :param message_expiry_in_seconds: How soon the message will expire if not received by a server (defaults to
                                            sixty seconds unless the settings are otherwise)
          :type message_expiry_in_seconds: int
          :param suppress_response: If `True`, the service will process the request normally but omit the step of
                                    sending a response back to the client (use this feature to implement send-and-forget
                                    patterns for asynchronous execution)
          :type suppress_response: bool
  
          :return: The request ID
          :rtype: int
  
          :raise: ConnectionError, InvalidField, MessageSendError, MessageSendTimeout, MessageTooLarge
          """
  
          control_extra = control_extra.copy() if control_extra else {}
          if message_expiry_in_seconds and 'timeout' not in control_extra:
              control_extra['timeout'] = message_expiry_in_seconds
  
          handler = self._get_handler(service_name)
          control = self._make_control_header(
              continue_on_error=continue_on_error,
              control_extra=control_extra,
              suppress_response=suppress_response,
          )
          context = self._make_context_header(
              switches=switches,
              correlation_id=correlation_id,
              context_extra=context,
          )
          job_request = JobRequest(actions=actions, control=control, context=context or {})
          return handler.send_request(job_request, message_expiry_in_seconds)