public async Task Run(
            [ServiceBusTrigger("%ContactsTopicName%", "%ExposedContactsSubscription%", Connection = "ContactsTopicListenConnection")] Message message,
            MessageReceiver messageReceiver,
            [ServiceBus("%NotificationsTopicName%", Connection = "NotificationTopicSendConnection")] MessageSender messagesQueue)
        {
            logger.LogInformation($"C# ServiceBus topic trigger function processed message: {message}");

            try
            {
                message.UserProperties.TryGetValue(MessageHeaders.UserToken, out object userTokenHeader);
                var infectedUserToken = userTokenHeader?.ToString();

                var exposedContact = MessageHelper.GetMessageBody <ExposedContact>(message);

                if (string.IsNullOrEmpty(exposedContact.UserToken))
                {
                    throw new ApplicationException("The UserToken is required");
                }

                if (exposedContact.MeetingTime == DateTime.MinValue)
                {
                    throw new ApplicationException("The MeetingTime is required");
                }

                logger.LogInformation(
                    "UserToken: {userToken}. Exposed contact {contactToken} received.",
                    infectedUserToken,
                    exposedContact.UserToken);

                infectionService.MessageSender = messagesQueue;
                await infectionService.ProcessContact(exposedContact);

                await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
            }
            catch (Exception ex)
            {
                // Manage retries using our message retry handler
                if (!await RetryHandler.RetryMessageAsync(
                        message,
                        ex,
                        messageReceiver,
                        policyOptions,
                        logger))
                {
                    logger.LogError($"Unhandled exception: {ex.Message}", ex);
                    throw;
                }
            }
        }
Esempio n. 2
0
        public async Task Run(
            [ServiceBusTrigger("%NotificationsTopicName%", "%StatusNotificationSubscription%", Connection = "NotificationsTopicListenConnection")] Message message,
            MessageReceiver messageReceiver)
        {
            logger.LogInformation($"C# ServiceBus topic trigger function processed message: {message}");

            try
            {
                message.UserProperties.TryGetValue(MessageHeaders.UserToken, out object userTokenHeader);
                var contactToken = userTokenHeader?.ToString();

                var pushNotification = MessageHelper.GetMessageBody <PushNotification>(message);

                if (pushNotification == null || !pushNotification.IsValid())
                {
                    throw new BadMessageException("Invalid message received.");
                }

                logger.LogInformation("ContactToken: {contactToken}. Sending notification...", contactToken);
                await notificationsService.PushMessageAsync(pushNotification);

                await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
            }
            catch (Exception ex)
            {
                // Manage retries using our message retry handler
                if (!await RetryHandler.RetryMessageAsync(
                        message,
                        ex,
                        messageReceiver,
                        policyOptions,
                        logger))
                {
                    logger.LogError(ex, $"Unhandled exception: {ex.Message}");
                    throw;
                }
            }
        }