Любой способ проверить триггер служебной шины к SendGridMessage успешно перед выполнением кода? - PullRequest
0 голосов
/ 15 мая 2018

У меня сейчас есть функция azure, которая запускается по триггеру служебной шины (триггеру очереди) и выводит SendGridMessage.Хитрость заключается в том, что мне нужно выполнить некоторую очистку в хранилище больших двоичных объектов после того, как функция успешно отправила сообщение sendgrid, но, похоже, у меня нет способа определить, была ли функция успешной, пока она не выйдет из области видимости.

В настоящее время я пытаюсь отправить сообщение, которое необходимо очистить, в очередь очистки и позаботиться об этом после перехвата попытки, но я думаю, что все еще сталкиваюсь с той же проблемой.Функция может завершиться успешно, а затем потерпеть неудачу на выходе SendGrid, и сообщение будет очищено, но отброшено обратно в очередь для повторной обработки в этой функции и завершится ошибкой.Bleh.

Триггер очереди и выходные данные Sendgrid

[FunctionName("ProcessEmail")]
public static void Run([ServiceBusTrigger("email-queue-jobs", AccessRights.Manage, 
    Connection = "MicroServicesServiceBus")]OutgoingEmail outgoingEmail, TraceWriter log,
    [ServiceBus("email-queue-cleanup", Connection = "MicroServicesServiceBus", 
    EntityType = Microsoft.Azure.WebJobs.ServiceBus.EntityType.Queue)] IAsyncCollector<OutgoingEmail> cleanupEmailQueue,
    [SendGrid] out SendGridMessage message)
{
    try
    {
        log.Info($"Attempting to send the email {outgoingEmail.Id}");
        message = SendgridHelper.ConvertToSendgridMessage(outgoingEmail);

        log.Info("Successfully sent email:");
        log.Info(JsonConvert.SerializeObject(outgoingEmail));
    }
    catch (Exception ex)
    {
        message = null;
        throw ex;
    }

    // Add email to the cleanup queue
    log.Info("Sending email to the cleanup queue.");
    cleanupEmailQueue.AddAsync(outgoingEmail).Wait();
}

1 Ответ

0 голосов
/ 15 мая 2018

Вы должны быть в состоянии достигнуть этого, используя ICollector или IAsyncCollector

[SendGrid] ICollector<SendGridMessage> messageCollector)

, а затем

var message = SendgridHelper.ConvertToSendgridMessage(outgoingEmail);
messageCollector.Add(message);

должен вызвать SendGrid синхронно и вызвать исключение в случаесбоя.

Если вы хотите использовать IAsyncCollector (как вы уже делаете для другой привязки), обязательно вызовите также метод FlushAsync:

[SendGrid] IAsyncCollector<SendGridMessage> messageCollector)

, а затем

var message = SendgridHelper.ConvertToSendgridMessage(outgoingEmail);
await messageCollector.AddAsync(message);
await messageCollector.FlushAsync();
...