首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于响应消息的通用消费过滤器的全面注册?

用于响应消息的通用消费过滤器的全面注册?
EN

Stack Overflow用户
提问于 2020-10-06 06:45:23
回答 1查看 191关注 0票数 0

我需要为所有消息配置一个消费过滤器,使其

  • 处理所有消息,包括使用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,它可以用于向响应管道中添加自定义筛选器规范,但是这个特性不会公开。

EN

回答 1

Stack Overflow用户

发布于 2020-10-06 12:25:52

为了满足这一要求,您应该遵循与message retry - using使用的相同模式--一个配置观察者,它被调用,因为每个接收端点上都配置了每种消息类型(包括总线端点,请求客户端用来接收响应)。

在MassTransit源代码中最好的起点是配置扩展方法中的这里

配置观察者有一个为每个接收端点的每个消息类型调用一次的方法,它包括消息类型的一个泛型参数,允许为每个消息类型构造一个强类型筛选器(ConsumeContext<T>)。

代码语言:javascript
复制
    public void MessageConfigured<TMessage>(IConsumePipeConfigurator configurator)
        where TMessage : class
    {
        var specification = new YourFilterPipeSpecification<TMessage>();

        configurator.AddPipeSpecification(specification);
    }

这将为每个接收端点的每个消息类型提供一个筛选器,然后您可以使用它来执行您的命令。不需要任何标记接口,但您可以选择检查TMessage,并且只为特定类型添加筛选器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64220624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档