Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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));
        }
Exemplo n.º 4
0
        /// <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);
        }