MassTransit:如何在 IRetryObserver 中检索消息的内容
MassTransit : how to retrieve the content of the message in the IRetryObserver
使用 IRetryObserver,我正在观察并记录所有重试尝试及其最终结果(无论消息是否最终成功处理)。
我想知道是否可以在观察者的方法中访问消息的 json 负载?
我使用这段代码设法访问了消息的类型:
context.ContextType.IsGenericType?context.ContextType.GetGenericArguments().First().Name:"Unknown";
但是我找不到获取消息内容的方法
谢谢
我找到了这样做的方法,RetryContext 的内部上下文是一个 class,它派生自 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),您也可以 cas 为 ConsumeContext<object>
,这将始终为真( public interface ConsumeContext<out T>
:T 是协变的)。
然后,处理未类型化的消息:获取其 json 有效负载,将其保存在某处,等等
使用 IRetryObserver,我正在观察并记录所有重试尝试及其最终结果(无论消息是否最终成功处理)。
我想知道是否可以在观察者的方法中访问消息的 json 负载?
我使用这段代码设法访问了消息的类型:
context.ContextType.IsGenericType?context.ContextType.GetGenericArguments().First().Name:"Unknown";
但是我找不到获取消息内容的方法
谢谢
我找到了这样做的方法,RetryContext 的内部上下文是一个 class,它派生自 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),您也可以 cas 为 ConsumeContext<object>
,这将始终为真( public interface ConsumeContext<out T>
:T 是协变的)。
然后,处理未类型化的消息:获取其 json 有效负载,将其保存在某处,等等