public Task StartReceivingMessages(MessageHandlerExecutor messageHandlerExecutor) { queueClient = new QueueClient(connectionString, configuration.ReceiveOptions.QueueName); queueClient.RegisterMessageHandler( async(message, cancellationToken) => { try { await messageHandlerExecutor.Execute(GetMessageBody(message, ReceivingMessageTypeNames), new AzureServiceBusMessageContext(Bus, message), cancellationToken).ConfigureAwait(false); } catch (Exception e) { var exception = e is System.Reflection.TargetInvocationException ? e.InnerException : e; var propertiesToModify = new Dictionary <string, object> { { "ExceptionType", exception.GetType().Name }, { "ExceptionMessage", exception.Message }, { "ExceptionStackTrace", exception.StackTrace } }; if (exception.InnerException != null) { var innerException = exception.InnerException; propertiesToModify.Add("InnerExceptionType", innerException.GetType().Name); propertiesToModify.Add("InnerExceptionMessage", innerException.Message); propertiesToModify.Add("InnerExceptionStackTrace", innerException.StackTrace); } await queueClient.AbandonAsync( message.SystemProperties.LockToken, propertiesToModify).ConfigureAwait(false); } }, new MessageHandlerOptions(_ => Task.CompletedTask) { MaxConcurrentCalls = configuration.ReceiveOptions.MaxConcurrentCalls, MaxAutoRenewDuration = configuration.ReceiveOptions.MaxAutoRenewDuration }); return(Task.CompletedTask); object GetMessageBody(ServiceBusMessage message, IReceivingMessageTypeNames messageTypeNames) { var messageTypeName = message.UserProperties[UserProperties.MessageTypeKey].ToString(); var type = messageTypeNames.GetReceivingTypeByMessageTypeName(messageTypeName); return(JsonConvert.DeserializeObject(Encoding.UTF8.GetString(message.Body), type)); } }
public Task StartReceivingMessages(MessageHandlerExecutor messageHandlerExecutor) { if (receivingQueue == null) { return(Task.CompletedTask); } timer.Elapsed += async(sender, e) => { var cloudQueueMessage = await receivingQueue.GetMessageAsync( configuration.ReceiveOptions.MaxAutoRenewDuration, new QueueRequestOptions { MaximumExecutionTime = configuration.ReceiveOptions.MaxAutoRenewDuration }, new OperationContext()).ConfigureAwait(false); if (cloudQueueMessage == null) { return; } var message = cloudQueueMessage.UnwrapAndDeserializeMessage(ReceivingMessageTypeNames); try { await messageHandlerExecutor.Execute( message, new AzureStorageQueueMessageContext(Bus, cloudQueueMessage), cancellationTokenSource.Token).ConfigureAwait(false); await receivingQueue.DeleteMessageAsync(cloudQueueMessage); } catch (Exception) { if (cloudQueueMessage.DequeueCount < configuration.ReceiveOptions.MaxDequeueCount) { await receivingQueue.UpdateMessageAsync( cloudQueueMessage, TimeSpan.Zero, MessageUpdateFields.Visibility).ConfigureAwait(false); } else { await receivingQueue.DeleteMessageAsync(cloudQueueMessage); await receivingPoisonQueue.AddMessageAsync(cloudQueueMessage); } }; }; timer.Start(); return(Task.CompletedTask); }
public async Task Start() { await busTransport.InitializePublishingEndpoint().ConfigureAwait(false); if (!busTransport.IsPublishAndSendOnly) { busTransport.ReceivingMessageTypeNames = busMessages; if (dependencyResolver == null) { throw new InvalidOperationException("Receiving bus requires message handlers. Add message handlers through dependency injection or BusBuilder."); } await busTransport.InitializeReceivingEndpoint().ConfigureAwait(false); var executor = new MessageHandlerExecutor(dependencyResolver, messageHandlingExceptionHandler); await busTransport.StartReceivingMessages(executor).ConfigureAwait(false); } }
public Task StartReceivingMessages(MessageHandlerExecutor messageHandlerExecutor) { subscriptionClient = new SubscriptionClient(connectionString, TopicName, configuration.ReceiveOptions.QueueName); subscriptionClient.RegisterMessageHandler( (message, cancellationToken) => messageHandlerExecutor.Execute(GetMessageBody(message, MessageTypeNames), new AzureServiceBusMessageContext(message), cancellationToken), new MessageHandlerOptions(_ => Task.CompletedTask) { }); return(Task.CompletedTask); object GetMessageBody(ServiceBusMessage message, IMessageTypeNames messageTypeNames) { var messageTypeName = message.UserProperties[UserProperties.MessageTypeKey].ToString(); var type = messageTypeNames.GetTypeByMessageTypeName(messageTypeName); return(JsonConvert.DeserializeObject(Encoding.UTF8.GetString(message.Body), type)); } }