public async Task <TResponse> CallAsync <TRequest, TResponse>(TRequest request, string exchangeName, string subscriberQueueName, string routingKey = "") { _rabbitMqSubscriber.Subscribe(subscriberQueueName, OnMessageReceived); var tcs = new TaskCompletionSource <string>(); var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(TIMEOUT_MS)); ct.Token.Register(() => tcs.TrySetCanceled(), false); var correlationId = Guid.NewGuid().ToString(); _pendingMessages[correlationId] = tcs; _logger.LogInformation("RPC request {@Data}", new { CorrelationId = correlationId }); _rabbitMqPublisher.Publish(request, exchangeName, routingKey, subscriberQueueName, correlationId); var response = await tcs.Task; _logger.LogInformation("Received RPC response {@Data}", new { CorrelationId = correlationId }); return(JsonConvert.DeserializeObject <TResponse>(response)); }
public void Subscribe <TRequest, TResponse>(Func <TRequest, Task <TResponse> > action, string queueName) { _rabbitMqSubscriber.Subscribe(queueName, args => OnMessageReceived(args, action)); }