Пример #1
0
        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));
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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));
            }
        }