未处理 rabbitmq 类型异常的 masstransit 3

masstransit 3 for rabbitmq typed exception not handled

我在使用故障消息时遇到问题,但未得到处理。 处理程序代码是:

internal class FaultConsumer : IConsumer<Fault<MyMessage>>
    {
        public Task Consume(ConsumeContext<Fault<MyMessage>> context)
        {
            var ctx = context;
            var sourceMessage = ctx.Message.Message;
            // ... processign
        }
    }

但是如果我创建非通用消费者它工作正常,比如:

internal class FaultConsumerNonGeneric : IConsumer<Fault>
        {
            public Task Consume(ConsumeContext<Fault> context)
            {
                var ctx = context;
                // here I cannot get source message
            }
        }

这是消费者注册码:

var errorBus = Bus.Factory.CreateUsingRabbitMq(ebs =>
            {
                var host = ebs.Host(new Uri("rabbitmq://localhost/"), h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });
                ebs.ReceiveEndpoint(host, "error_handler", endpoint =>
                {
                    endpoint.Consumer(ConsumerFault);
                });
            });
errorBus.Start();

在 adim 面板中,我看到许多类型化的故障消息未传送到 error_handler 队列中的 FaultConsumer,但 MT 创建的 error_handler_error 队列包含错误: see the screenshot

所以问题是我做错了什么?如何正确消费类型化故障?谢谢。

rabbitmq消息示例:

Content-Type:   application/vnd.masstransit+json
MT-Reason:  fault
MT-Fault-Message:   Тип "DynamicInternal08d37bdc15c6c87e10c37bca6d210000.MassTransit.Fault<Consumer.MyMessage>" из сборки "MassTransitDynamicInternal08d37bdc15c6c87e10c37bca6d210000, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" пытается реализовать недоступный интерфейс.
MT-Fault-Timestamp: 2016-05-14T09:42:39.4976501Z
MT-Fault-StackTrace:    в System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type) 
в System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() 
в System.Reflection.Emit.TypeBuilder.CreateType() 
в MassTransit.Internals.Reflection.DynamicImplementationBuilder.CreateTypeFromInterface(ModuleBuilder builder, Type interfaceType)
MT-Host-MachineName:    SHARPCODER-PC
MT-Host-ProcessName:    Consumer.vshost
MT-Host-ProcessId:  13024
MT-Host-Assembly:   Consumer
MT-Host-AssemblyVersion:    1.0.0.0
MT-Host-MassTransitVersion: 3.3.2.641
MT-Host-FrameworkVersion:   4.0.30319.42000
MT-Host-OperatingSystemVersion: Microsoft Windows NT 6.2.9200.0

要让 MassTransit 能够使用在消费者出错时创建的故障消息,消息类型必须是 public class,可以创建为通用故障 class。否则故障不能被你的故障消费者消费。

你也应该消费 Fault,而不是消费者类型:

public class YourMessage
{
}

public class MyConsumer :
    IConsumer<Fault<YourMessage>>
{
}