Masstransit InboundMessageInterceptor与Consumer在不同的lifetimess

本文关键字:lifetimess InboundMessageInterceptor Consumer Masstransit | 更新日期: 2023-09-27 17:53:59

我已经在我的消息中添加了我自己的头,我需要在消费者被调用之前处理它们来为我的消费者设置DB上下文(头允许我设置我的NHibernate会话连接到正确的DB,我不想在每个消费者中都要处理)。我正在使用Autofac,我已经创建了IInboundMessageInterceptor的实现,它处理消息头。我注册拦截器与autofacc,它解决了每条消息。但是当我到达我的消费者时,被处理的每个消息的生命周期范围是不同的,并且我在MessageInterceptor中配置的会话不再在新的生命周期范围中配置。

a)是否有一种方法可以在与消费者相同的生命周期范围内处理MessageInterceptor ?b)是否有另一个地方,在与消费者相同的范围内,我可以拦截所有消息并处理报头?我查看了BeforeConsumingMessage,但是它没有我可以看到的当前消息的上下文。

谢谢

Masstransit InboundMessageInterceptor与Consumer在不同的lifetimess

如果你正在管理生命周期范围,你真的应该在IConsumerFactory级别进行拦截,而不是使用消息拦截器。

查看AutofacConsumerFactory<T>的源代码,您可以创建自己的实现来装饰它,或者您可以自定义并使用自己的实现来管理事务范围,而不是嵌套它们,从而在这方面造成复杂性。

这样,消费者收到的任何消息都用适当的ISession设置包装。

Autofac并不了解MassTransit。对象的解析被抽象在Func<T>后面,因此它不绑定到任何容器。与这些选择相关的是,在解决消费者问题时,目前还没有办法说"这是一个会话"和范围。

我目前想不出一种方法可以在没有大量撕裂内部的情况下设置。我会在https://github.com/masstransit/masstransit上发布一个问题,也许我们可以一起想出一个合理的方法来解决这个问题。