public virtual async Task OnRequestSendingError <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest,
                                                                             NimbusMessage nimbusMessage,
                                                                             Exception exception)
     where TBusRequest : IBusRequest <TBusRequest, TBusResponse>
     where TBusResponse : IBusResponse
 {
 }
Beispiel #2
0
        public override Task OnRequestHandlerExecuting <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, NimbusMessage nimbusMessage)
        {
            CallContext.LogicalSetData(nameof(DispatchContext.CorrelationId), DispatchContext.CorrelationId);
            CallContext.LogicalSetData(nameof(DispatchContext.ResultOfMessageId), DispatchContext.ResultOfMessageId);

            return(base.OnRequestHandlerExecuting(busRequest, nimbusMessage));
        }
Beispiel #3
0
        public static TResponse Request <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest)
            where TRequest : IBusRequest <TRequest, TResponse>
            where TResponse : IBusResponse
        {
            var response = Instance.Request(busRequest);

            response.Wait();
            return(response.Result);
        }
 public Task <TResponse> Request <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest)
     where TRequest : IBusRequest <TRequest, TResponse>
     where TResponse : IBusResponse
 {
     using (var context = _contextResolver())
     {
         var handler = context.LifetimeScope.Resolve <IHandleRequest <TRequest, TResponse> >();
         return(handler.Handle((TRequest)busRequest));
     }
 }
Beispiel #5
0
 public virtual Task OnRequestHandlerSuccess <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, NimbusMessage nimbusMessage)
     where TBusRequest : IBusRequest <TBusRequest, TBusResponse>
     where TBusResponse : IBusResponse
 {
     return(CompletedTask);
 }
 public virtual async Task OnRequestSent <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, NimbusMessage nimbusMessage)
     where TBusRequest : IBusRequest <TBusRequest, TBusResponse>
     where TBusResponse : IBusResponse
 {
 }
 public Task <TResponse> Request <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest, TimeSpan timeout)
     where TRequest : IBusRequest <TRequest, TResponse>
     where TResponse : IBusResponse
 {
     throw new NotImplementedException("Only available after upgrading to Nimbus");
 }
Beispiel #8
0
        public async Task <TResponse> SendRequest <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest, TimeSpan timeout)
            where TRequest : IBusRequest <TRequest, TResponse>
            where TResponse : IBusResponse
        {
            var requestType = busRequest.GetType();

            _knownMessageTypeVerifier.AssertValidMessageType(requestType);

            var queuePath = _router.Route(requestType, QueueOrTopic.Queue);

            var nimbusMessage = (await _nimbusMessageFactory.Create(queuePath, busRequest))
                                .WithRequestTimeout(timeout)
            ;

            DispatchLoggingContext.NimbusMessage = nimbusMessage;

            var expiresAfter = _clock.UtcNow.Add(timeout);
            var responseCorrelationWrapper = _requestResponseCorrelator.RecordRequest <TResponse>(nimbusMessage.MessageId, expiresAfter);

            var sw = Stopwatch.StartNew();

            using (var scope = _dependencyResolver.CreateChildScope())
            {
                Exception exception;
                var       interceptors = _outboundInterceptorFactory.CreateInterceptors(scope, nimbusMessage);

                try
                {
                    _logger.LogDispatchAction("Sending", queuePath, sw.Elapsed);

                    var sender = _transport.GetQueueSender(queuePath);
                    foreach (var interceptor in interceptors)
                    {
                        await interceptor.OnRequestSending(busRequest, nimbusMessage);
                    }
                    await sender.Send(nimbusMessage);

                    foreach (var interceptor in interceptors.Reverse())
                    {
                        await interceptor.OnRequestSent(busRequest, nimbusMessage);
                    }
                    _logger.LogDispatchAction("Sent", queuePath, sw.Elapsed);

                    _logger.LogDispatchAction("Waiting for response to", queuePath, sw.Elapsed);
                    var response = await responseCorrelationWrapper.WaitForResponse(timeout);

                    _logger.LogDispatchAction("Received response to", queuePath, sw.Elapsed);

                    return(response);
                }
                catch (Exception exc)
                {
                    exception = exc;
                }

                foreach (var interceptor in interceptors.Reverse())
                {
                    await interceptor.OnRequestSendingError(busRequest, nimbusMessage, exception);
                }
                _logger.LogDispatchError("sending", queuePath, sw.Elapsed, exception);
                //FIXME "sending" here is a bit misleading. The message could have been sent and the response not received.

                ExceptionDispatchInfo.Capture(exception).Throw();
                return(default(TResponse));
            }
        }
Beispiel #9
0
 public static Task <TResponse> RequestAsync <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest)
     where TRequest : IBusRequest <TRequest, TResponse>
     where TResponse : IBusResponse
 {
     return(Instance.Request(busRequest));
 }
Beispiel #10
0
 public virtual Task OnRequestHandlerExecuting <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, BrokeredMessage brokeredMessage)
     where TBusRequest : IBusRequest <TBusRequest, TBusResponse>
     where TBusResponse : IBusResponse
 {
     return(CompletedTask);
 }
Beispiel #11
0
 public Task <TResponse> Request <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest, TimeSpan timeout)
     where TRequest : IBusRequest <TRequest, TResponse>
     where TResponse : IBusResponse
 {
     return(_taskFactory.StartNew(() => _requestSender.SendRequest(busRequest, timeout), TaskContext.Send).Unwrap());
 }
Beispiel #12
0
 public virtual async Task OnRequestSent <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, BrokeredMessage brokeredMessage)
     where TBusRequest : IBusRequest <TBusRequest, TBusResponse>
     where TBusResponse : IBusResponse
 {
 }
 public override async Task OnRequestSent <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, NimbusMessage nimbusMessage)
 {
     var auditEvent = CreateAuditEvent(busRequest, nimbusMessage);
     await Bus.Publish(auditEvent);
 }
Beispiel #14
0
 public virtual Task OnRequestHandlerError <TBusRequest, TBusResponse>(IBusRequest <TBusRequest, TBusResponse> busRequest, NimbusMessage nimbusMessage, Exception exception)
     where TBusRequest : IBusRequest <TBusRequest, TBusResponse>
     where TBusResponse : IBusResponse
 {
     return(CompletedTask);
 }
Beispiel #15
0
 public async Task <TResponse> SendRequest <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest)
     where TRequest : IBusRequest <TRequest, TResponse>
     where TResponse : IBusResponse
 {
     return(await SendRequest(busRequest, _responseTimeout));
 }
Beispiel #16
0
 public Task <TResponse> Request <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest, TimeSpan timeout)
     where TRequest : IBusRequest <TRequest, TResponse>
     where TResponse : IBusResponse
 {
     return(Task.Run(() => _requestSender.SendRequest(busRequest, timeout)).ConfigureAwaitFalse());
 }
Beispiel #17
0
        public async Task <TResponse> SendRequest <TRequest, TResponse>(IBusRequest <TRequest, TResponse> busRequest, TimeSpan timeout)
            where TRequest : IBusRequest <TRequest, TResponse>
            where TResponse : IBusResponse
        {
            var requestType = busRequest.GetType();

            _knownMessageTypeVerifier.AssertValidMessageType(requestType);

            var queuePath = _router.Route(requestType, QueueOrTopic.Queue);

            var brokeredMessage = (await _brokeredMessageFactory.Create(busRequest))
                                  .WithRequestTimeout(timeout)
                                  .DestinedForQueue(queuePath)
            ;

            var expiresAfter = _clock.UtcNow.Add(timeout);
            var responseCorrelationWrapper = _requestResponseCorrelator.RecordRequest <TResponse>(Guid.Parse(brokeredMessage.MessageId), expiresAfter);

            using (var scope = _dependencyResolver.CreateChildScope())
            {
                Exception exception;
                var       interceptors = _outboundInterceptorFactory.CreateInterceptors(scope, brokeredMessage);

                try
                {
                    _logger.LogDispatchAction("Sending", queuePath, brokeredMessage);

                    var sender = _messagingFactory.GetQueueSender(queuePath);
                    foreach (var interceptor in interceptors)
                    {
                        await interceptor.OnRequestSending(busRequest, brokeredMessage);
                    }
                    await sender.Send(brokeredMessage);

                    foreach (var interceptor in interceptors.Reverse())
                    {
                        await interceptor.OnRequestSent(busRequest, brokeredMessage);
                    }
                    _logger.LogDispatchAction("Sent", queuePath, brokeredMessage);

                    _logger.LogDispatchAction("Waiting for response to", queuePath, brokeredMessage);
                    var response = await responseCorrelationWrapper.WaitForResponse(timeout);

                    _logger.LogDispatchAction("Received response to", queuePath, brokeredMessage);

                    return(response);
                }
                catch (Exception exc)
                {
                    exception = exc;
                }

                foreach (var interceptor in interceptors.Reverse())
                {
                    await interceptor.OnRequestSendingError(busRequest, brokeredMessage, exception);
                }
                _logger.LogDispatchError("sending", queuePath, brokeredMessage, exception);

                ExceptionDispatchInfo.Capture(exception).Throw();
                return(default(TResponse));
            }
        }