/// <summary> /// Should be invoked by the concrete bus implementation whenever there is a message arrived on the reply to topic name. /// </summary> /// <param name="reponse"></param> /// <param name="name"></param> /// <param name="requestId"></param> /// <param name="errorMessage"></param> /// <returns></returns> public virtual Task <Exception> OnResponseArrived(byte[] responsePayload, string name, string requestId, string errorMessage, object response = null) { var requestState = PendingRequestStore.GetById(requestId); if (requestState == null) { _logger.LogDebug("The response message for request id {0} arriving on name {1} will be disregarded. Either the request had already expired, had been cancelled or it was already handled (this response message is a duplicate).", requestId, name); // ToDo: add and API hook to these kind of situation return(Task.FromResult <Exception>(null)); } try { if (_logger.IsEnabled(LogLevel.Debug)) { var tookTimespan = CurrentTime.Subtract(requestState.Created); _logger.LogDebug("Response arrived for {0} on name {1} (time: {2} ms)", requestState, name, tookTimespan); } if (errorMessage != null) { // error response arrived _logger.LogDebug("Response arrived for {0} on name {1} with error: {2}", requestState, name, errorMessage); var e = new RequestHandlerFaultedMessageBusException(errorMessage); requestState.TaskCompletionSource.TrySetException(e); } else { // response arrived try { // deserialize the response message response = responsePayload != null?DeserializeResponse(requestState.ResponseType, responsePayload) : response; // resolve the response requestState.TaskCompletionSource.TrySetResult(response); } catch (Exception e) { _logger.LogDebug("Could not deserialize the response message for {0} arriving on name {1}: {2}", requestState, name, e); requestState.TaskCompletionSource.TrySetException(e); } } } finally { // remove the request from the queue PendingRequestStore.Remove(requestId); } return(Task.FromResult <Exception>(null)); }
/// <summary> /// Should be invoked by the concrete bus implementation whenever there is a message arrived on the reply to topic name. /// </summary> /// <param name="payload"></param> /// <param name="name"></param> /// <param name="requestId"></param> /// <param name="errorMessage"></param> /// <returns></returns> public virtual Task OnResponseArrived(byte[] payload, string name, string requestId, string errorMessage) { var requestState = PendingRequestStore.GetById(requestId); if (requestState == null) { Log.DebugFormat(CultureInfo.InvariantCulture, "The response message for request id {0} arriving on name {1} will be disregarded. Either the request had already expired, had been cancelled or it was already handled (this response message is a duplicate).", requestId, name); // ToDo: add and API hook to these kind of situation return(Task.CompletedTask); } try { if (Log.IsDebugEnabled) { var tookTimespan = CurrentTime.Subtract(requestState.Created); Log.DebugFormat(CultureInfo.InvariantCulture, "Response arrived for {0} on name {1} (time: {2} ms)", requestState, name, tookTimespan); } if (errorMessage != null) { // error response arrived Log.DebugFormat(CultureInfo.InvariantCulture, "Response arrived for {0} on name {1} with error: {2}", requestState, name, errorMessage); var e = new RequestHandlerFaultedMessageBusException(errorMessage); requestState.TaskCompletionSource.TrySetException(e); } else { // response arrived try { // deserialize the response message var response = Settings.Serializer.Deserialize(requestState.ResponseType, payload); // resolve the response requestState.TaskCompletionSource.TrySetResult(response); } catch (Exception e) { Log.DebugFormat(CultureInfo.InvariantCulture, "Could not deserialize the response message for {0} arriving on name {1}: {2}", requestState, name, e); requestState.TaskCompletionSource.TrySetException(e); } } } finally { // remove the request from the queue PendingRequestStore.Remove(requestId); } return(Task.CompletedTask); }