【问题标题】:masstransit 3 for rabbitmq typed exception not handled未处理rabbitmq类型异常的masstransit 3
【发布时间】:2016-05-14 09:48:07
【问题描述】:

我在使用错误消息时遇到问题,它没有得到处理。 处理程序代码是:

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

【问题讨论】:

  • 如果您查看其中一条消息(在 RabbitMQ 控制台中使用 Get 消息),标题部分中显示的错误是什么?
  • 我的消费者没有收到通用故障消息的问题
  • 您发布的屏幕截图显示错误处理程序队列中的错误,我要求您查看其中一条消息的标头以了解为什么未使用错误消息。
  • 对不起,先不明白。看题主,我发了一个错误
  • 你能添加你的消息类定义吗?好像有什么东西不能创建,可能是内部的或者私有的,不能创建?

标签: c# .net rabbitmq masstransit


【解决方案1】:

要使 MassTransit 能够使用在消费者发生故障时创建的故障消息,消息类型必须是可以创建为通用故障类的公共类。否则,你的故障消费者无法消费故障。

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

public class YourMessage
{
}

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

【讨论】:

    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2012-12-22
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多