如何解决Masstransit-为响应消息一揽子注册通用消费过滤器?
我需要为所有消息配置一个消耗过滤器
- 处理所有消息,包括消费者使用
context.RespondAsync
发送的响应。这样的响应消息没有显式的使用方,由MassTransit在后台作为请求-响应模式的一部分进行处理,例如调用IRequestClient<TRequest>.GetResponse<TResponse>
方法时 - 可以访问强类型的消息对象
可以将IFilter<ConsumeContext>
的实现插入到管道中。这种过滤器在应用于响应(会议要求1)时,会传递一个ConsumeContext
(未能满足要求2)。
另一方面,可以插入IFilter<ConsumeContext<T>>
的实现。这样的过滤器将获得具有ConsumeContext<T>
属性的Message
,并且可以访问消息,但是需要针对每种消息类型在每个消息的基础上添加。
ConfigurationObserver
(https://masstransit-project.com/advanced/middleware/custom.html)自动为所有消息类型连接通用消耗过滤器。但是,它不包括没有用户定义使用者的响应消息。
是否可以创建这样的过滤器而无需例如使用标记接口进行响应,扫描组件的标记接口并手动为每个接口注册单独的过滤器?
我们正在使用Masstransit v6.3.1。
PS作为旁注,似乎ClientRequestHandle
的私有Response<T>
方法采用了Action<IHandlerConfigurator<T>> configure = null
,可用于向响应管道添加自定义过滤器规范,但这该功能未公开公开。
解决方法
要满足此要求,您应该遵循消息重试所使用的相同模式–使用配置观察器,该观察器被称为是在每个接收端点(包括请求所使用的总线端点)上配置了每种消息类型客户收到回复)。
在MassTransit源代码中最好的起点是使用配置扩展方法的here。
配置观察器具有一个方法,该方法针对每个接收端点的每种消息类型被调用一次,并且它包含该消息类型的通用参数,从而允许为每种消息类型构造一个强类型的过滤器(ConsumeContext<T>
)
public void MessageConfigured<TMessage>(IConsumePipeConfigurator configurator)
where TMessage : class
{
var specification = new YourFilterPipeSpecification<TMessage>();
configurator.AddPipeSpecification(specification);
}
这将为您提供每个接收端点的每种消息类型的筛选器,然后您可以用来进行出价。不需要任何标记接口,但是您可以选择检查TMessage
并仅添加特定类型的过滤器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。