我需要为所有消息配置一个消费过滤器,使其
context.RespondAsync的使用者发送的响应。这样的响应消息没有显式的使用者,并且作为请求-响应模式的一部分,由MassTransit作为请求响应模式的一部分来处理,例如在调用IRequestClient<TRequest>.GetResponse<TResponse>方法时。可以将IFilter<ConsumeContext>的实现插入到管道中。这种过滤器在应用于响应(满足需求1)时,会获得传递给它的ConsumeContext (未能满足要求2)。另一方面,可以插入IFilter<ConsumeContext<T>>的实现。这样的过滤器获得一个具有Message属性的Message,并且可以访问该消息,但是需要为每种消息类型添加一条消息。ConfigurationObserver (https://masstransit-project.com/advanced/middleware/custom.html)自动连接所有消息类型的通用消费筛选器。然而,它排除了响应消息,这些消息没有用户定义的使用者.
是否有可能在不使用标记接口进行响应、标记接口扫描程序集和手工为每个过滤器注册单独的过滤器的情况下创建这样的过滤器?
我们使用的是Masstransit v6.3.1。
另外需要注意的是,ClientRequestHandle的私有Response<T>方法似乎采用了一个Action<IHandlerConfigurator<T>> configure = null,它可以用于向响应管道中添加自定义筛选器规范,但是这个特性不会公开。
发布于 2020-10-06 12:25:52
为了满足这一要求,您应该遵循与message retry - using使用的相同模式--一个配置观察者,它被调用,因为每个接收端点上都配置了每种消息类型(包括总线端点,请求客户端用来接收响应)。
在MassTransit源代码中最好的起点是配置扩展方法中的这里。
配置观察者有一个为每个接收端点的每个消息类型调用一次的方法,它包括消息类型的一个泛型参数,允许为每个消息类型构造一个强类型筛选器(ConsumeContext<T>)。
public void MessageConfigured<TMessage>(IConsumePipeConfigurator configurator)
where TMessage : class
{
var specification = new YourFilterPipeSpecification<TMessage>();
configurator.AddPipeSpecification(specification);
}这将为每个接收端点的每个消息类型提供一个筛选器,然后您可以使用它来执行您的命令。不需要任何标记接口,但您可以选择检查TMessage,并且只为特定类型添加筛选器。
https://stackoverflow.com/questions/64220624
复制相似问题