MassTransit: как получить содержимое сообщения в IRetryObserver - PullRequest
0 голосов
/ 25 марта 2020

используя IRetryObserver, я наблюдаю и регистрирую все попытки повторных попыток и их окончательные результаты (независимо от того, было ли сообщение успешно обработано или нет).

Интересно, возможно ли получить доступ к json Полезная нагрузка сообщения в методах наблюдателя?

Мне удалось получить доступ к типу сообщения, используя этот фрагмент кода:

context.ContextType.IsGenericType?context.ContextType.GetGenericArguments().First().Name:"Unknown";

Но я не могу найти способ получить содержимое сообщения

Спасибо

1 Ответ

0 голосов
/ 07 апреля 2020

Я нашел способ сделать это, внутренний контекст RetryContext был классом, производным от интерфейса ConsumeContext, который предоставляет сообщение.

Я не уверен, что это всегда будет так, но в в моем случае это помогло:

private static bool TryGetMessagePayload<TContext, TMessage>(RetryContext<TContext> context, out TMessage message)
    where TContext : class, PipeContext
    where TMessage : class
{
    message = null;
    if (context.Context is ConsumeContext<TMessage> consumeContext)
        message = consumeContext.Message;

    return message != null;
}

в случае, если вы не знаете статически тип ожидаемого сообщения (например, если у вас есть глобальный RetryObserver для нескольких подписок), вы также можете указать как ConsumeContext<object>, который всегда будет истинным (public interface ConsumeContext<out T>: T является ковариантным).

Затем обработайте сообщение без типизации: получите его json полезную нагрузку, сохраните его где-нибудь и т.д. c

...