Я нашел способ сделать это, внутренний контекст 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