   @spec process_request(String.t(), Map) :: term
   def process_request(delivery_tag, payload) do
     request = RpcRequest.from_payload(payload)
+
+    task = Task.async(fn ->
+      process_request_internal(request, delivery_tag)
+    end)    
+
+    #attempt to execute the request for 5 minutes before failing it
+    try do
+      Task.await(task, 300_000)
+    catch
+      :exit, {:timeout, task} -> process_request_failure("Request has timed out during execution!", delivery_tag, request)
+      :exit, code -> process_request_failure("Exited with code #{inspect code}", delivery_tag, request)
+      :throw, value -> process_request_failure("Throw called with #{inspect value}", delivery_tag, request)
+      what, value -> process_request_failure("Caught #{inspect what} with #{inspect value}", delivery_tag, request)
+    end  
+  end
+
+  @doc """
+  Method to execute a FleetManager request
+  
+  ## Options
+
+  The `request` option is the parsed RpcRequest request
+
+  """
+  @spec process_request_internal(RpcRequest.t, String.t) :: term
+  def process_request_internal(request, delivery_tag) do
     try do
       Logger.debug("[Dispatcher][Request][#{delivery_tag}] Processing...")
       fleet_request = FleetRequest.from_payload(request.request_body)

    end)
  end

  @doc """
  Method to process FleetManager requests
  
  ## Options


      acknowledge(delivery_tag, request)
      Logger.debug("[Dispatcher][Request][#{delivery_tag}] Completed processing")
    catch
      :exit, code -> process_request_failure("Exited with code #{inspect code}", delivery_tag, request)
      :throw, value -> process_request_failure("Throw called with #{inspect value}", delivery_tag, request)
      what, value -> process_request_failure("Caught #{inspect what} with #{inspect value}", delivery_tag, request)           
    end
  end

  @doc """
