MassTransit 3.2.1 - 验证

Gra*_*zar 1 validation masstransit

我希望验证传入的消息,在我的情况下使用FluentValidation,如果失败则应立即返回.我查看了http://docs.masstransit-project.com/en/latest/usage/observers.html,就我而言,我喜欢这个想法

public class ConsumeObserver : IConsumeObserver
    {
    Task IConsumeObserver.PreConsume<T>(ConsumeContext<T> context)
    {
        //1.Validate here
        //2. If success go on to consumer
        //3. If fails exit with the result of validation and don't go through consumer.
    }

    Task IConsumeObserver.PostConsume<T>(ConsumeContext<T> context)
    {

    }

    Task IConsumeObserver.ConsumeFault<T>(ConsumeContext<T> context, Exception exception)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

因为我得到的消息已经反序列化,所以很容易使用验证器.问题是我不知道如何在不通过消费者的情况下返回,同时保持验证错误.

谢谢.

Chr*_*son 6

观察者通常会观察与采取行动,这是观察者在MassTransit中的方法.虽然您可以从该PreConsume方法中抛出异常,这会导致消息重试或被发送到错误队列,但对于可能无法理解消息失败原因的开发人员来说,这不是最明显的行为.

另一种方法是创建可以验证消息的中间件组件,如果它无效,则对消息执行特定操作(例如将其移动到无效队列,或将其转储到日志或其他任何方式),以便消息从队列中删除.了解这可能如何影响消息生成者非常重要.

例如,如果它是请求消息,并且发送方正在等待响应,则丢弃该消息意味着将不接收响应.抛出异常的使用者的默认行为是将错误传播回请求者,完成循环,因此请记住这一点.

另一种选择是使用注入的验证接口或消费者本身将验证行为添加到使用者.这样,消息的处理接近于消费者,这提高了代码的内聚力,并且可以很容易地看到正在发生的事情.

理想情况下,在消息生产者处进行验证是最佳选择,以避免使用无效消息充斥队列.这是另一种选择.

因此,有几种选择,您的要求将决定哪种选择最有意义.