/// <summary> /// Pipe log entries lines from a Docker API response stream back to the requesting actor. /// </summary> /// <param name="inFlightRequest"> /// The in-flight request for which a response will be streamed. /// </param> /// <param name="stream"> /// The stream to read from. /// </param> /// <returns> /// An <see cref="IActorRef"/> representing the actor that will perform the streaming. /// </returns> IActorRef StreamLogEntries(InFlightRequest inFlightRequest, Stream stream) { if (inFlightRequest == null) { throw new ArgumentNullException(nameof(inFlightRequest)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } IActorRef responseStreamer = Context.ActorOf( LogParser.Create(inFlightRequest.CorrelationId, inFlightRequest.ReplyTo, stream), name: $"log-stream-{inFlightRequest.CorrelationId}" ); InFlightRequest streamingRequest = inFlightRequest.WithResponseStreamer(responseStreamer); _inFlightRequests[streamingRequest.CorrelationId] = streamingRequest; _responseStreamers.Add(responseStreamer, streamingRequest); _logStreamOwners.Add(inFlightRequest.ReplyTo, inFlightRequest); Context.Watch(responseStreamer); Context.Watch(inFlightRequest.ReplyTo); return(responseStreamer); }
/// <summary> /// Cancel an in-flight request. /// </summary> /// <param name="inFlightRequest"> /// </param> void CancelRequest(InFlightRequest inFlightRequest) { if (inFlightRequest == null) { throw new ArgumentNullException(nameof(inFlightRequest)); } inFlightRequest.Cancel(); Context.Unwatch(inFlightRequest.ReplyTo); _inFlightRequests.Remove(inFlightRequest.CorrelationId); }
/// <summary> /// Execute a command. /// </summary> /// <param name="request"> /// An <see cref="ExecuteCommand"/> message indicating the command to execute. /// </param> /// <returns> /// The command result. /// </returns> async Task <CommandResult> Execute(ExecuteCommand request) { Log.Debug("Executing '{0}' command '{1}'.", request.RequestMessage.OperationName, request.CorrelationId ); InFlightRequest inFlightRequest = CreateRequest(request.RequestMessage, replyTo: Sender); Response responseMessage = await request.Command(_client, inFlightRequest.Cancellation); return(new CommandResult(responseMessage)); }
/// <summary> /// Create a new <see cref="InFlightRequest"/>. /// </summary> /// <param name="requestMessage"> /// The message that initiated the request. /// </param> /// <param name="replyTo"> /// The actor to which any response(s) will be sent. /// </param> /// <returns> /// The new <see cref="Request"/>. /// </returns> InFlightRequest CreateRequest(Request requestMessage, IActorRef replyTo) { if (replyTo == null) { throw new ArgumentNullException(nameof(replyTo)); } if (_inFlightRequests.ContainsKey(requestMessage.CorrelationId)) { throw new InvalidOperationException($"There is already a request with correlation Id '{requestMessage.CorrelationId}'."); } InFlightRequest request = new InFlightRequest(requestMessage, replyTo); _inFlightRequests.Add(request.CorrelationId, request); return(request); }