未处理 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>>
{
}
我在使用故障消息时遇到问题,但未得到处理。 处理程序代码是:
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>>
{
}