public void Add(PendingRequestState requestState) { lock (_itemsLock) { _items.Add(requestState.Id, requestState); } }
protected virtual async Task <TResponseMessage> SendInternal <TResponseMessage>(IRequestMessage <TResponseMessage> request, TimeSpan?timeout, string topic, CancellationToken cancellationToken) { if (Settings.RequestResponse == null) { throw new PublishMessageBusException("An attempt to send request when request/response communication was not configured for the message bus. Ensure you configure the bus properly before the application starts."); } // check if the cancellation was already requested cancellationToken.ThrowIfCancellationRequested(); var requestType = request.GetType(); var publisherSettings = GetPublisherSettings(requestType); if (topic == null) { topic = GetDefaultTopic(requestType, publisherSettings); } if (timeout == null) { timeout = GetDefaultRequestTimeout(requestType, publisherSettings); } var replyTo = Settings.RequestResponse.Topic; var created = CurrentTime; var expires = created.Add(timeout.Value); // generate the request guid var requestId = GenerateRequestId(); var requestPayload = SerializeRequest(requestType, request, requestId, replyTo, expires); // record the request state var requestState = new PendingRequestState(requestId, request, requestType, typeof(TResponseMessage), created, expires, cancellationToken); PendingRequestStore.Add(requestState); if (Log.IsTraceEnabled) { Log.TraceFormat("Added to PendingRequests, total is {0}", PendingRequestStore.GetCount()); } try { Log.DebugFormat("Sending request message {0} to topic {1} with reply to {2} and payload size {3}", requestState, topic, replyTo, requestPayload.Length); await PublishToTransport(requestType, request, topic, requestPayload); } catch (PublishMessageBusException e) { Log.DebugFormat("Publishing of request message failed: {0}", e); // remove from registry PendingRequestStore.Remove(requestId); throw; } // convert Task<object> to Task<TResponseMessage> var typedTask = Convert <TResponseMessage>(requestState.TaskCompletionSource.Task); return(await typedTask); }
protected virtual async Task <TResponseMessage> SendInternal <TResponseMessage>(IRequestMessage <TResponseMessage> request, TimeSpan?timeout, string name, CancellationToken cancellationToken) { AssertActive(); AssertRequestResponseConfigured(); // check if the cancellation was already requested cancellationToken.ThrowIfCancellationRequested(); var requestType = request.GetType(); var producerSettings = GetProducerSettings(requestType); if (name == null) { name = GetDefaultName(requestType, producerSettings); } if (timeout == null) { timeout = GetDefaultRequestTimeout(requestType, producerSettings); } var created = CurrentTime; var expires = created.Add(timeout.Value); // generate the request guid var requestId = GenerateRequestId(); var requestMessage = new MessageWithHeaders(); requestMessage.SetHeader(ReqRespMessageHeaders.RequestId, requestId); requestMessage.SetHeader(ReqRespMessageHeaders.Expires, expires); // record the request state var requestState = new PendingRequestState(requestId, request, requestType, typeof(TResponseMessage), created, expires, cancellationToken); PendingRequestStore.Add(requestState); if (Log.IsTraceEnabled) { Log.TraceFormat(CultureInfo.InvariantCulture, "Added to PendingRequests, total is {0}", PendingRequestStore.GetCount()); } try { Log.DebugFormat(CultureInfo.InvariantCulture, "Sending request message {0} to name {1} with reply to {2}", requestState, name, Settings.RequestResponse.Topic); await ProduceRequest(request, requestMessage, name, producerSettings).ConfigureAwait(false); } catch (PublishMessageBusException e) { Log.DebugFormat(CultureInfo.InvariantCulture, "Publishing of request message failed", e); // remove from registry PendingRequestStore.Remove(requestId); throw; } // convert Task<object> to Task<TResponseMessage> var responseUntyped = await requestState.TaskCompletionSource.Task.ConfigureAwait(true); return((TResponseMessage)responseUntyped); }
public void Add(PendingRequestState requestState) { Assert.IsNotNull(requestState, () => new ArgumentNullException(nameof(requestState))); lock (_itemsLock) { _items.Add(requestState.Id, requestState); } }