从程序集加载 MT 消费者时(使用 StructureMap
容器/MassTransit.StructureMap
集成 nuget 包)消息得到部分处理:总线句柄消息存储在队列中,之后没有响应,但您可以看到消息已添加到队列中。然后,如果您重新启动应用程序,它将处理队列中那些等待的消息,并且不会做更多的事情。
这是设置:
public class Application {
public static void Main() {
var container = new Container();
container.Configure(c => c.Scan(scan => {
scan.TheCallingAssembly();
scan.AddAllTypesOf<IConsumer>();
}));
var bus = ServiceBusFactory.New(sbc => {
sbc.UseRabbitMq();
sbc.ReceiveFrom("rabbitmq://localhost/app_commands");
sbc.Subscribe(x => x.LoadFrom(container));
sbc.Validate();
});
container.Inject(bus);
Console.WriteLine("* mt bus has been registered");
Console.ReadKey();
}
}
对应的消费者在同一个程序集中。如果我将订阅代码更改为:
sbc.Subscribe(x => x.Consumer<SendDocumentCommandHandler>().Permanent());
明确指定消费者类型并使其永久化,它将响应传入的命令。
使用 LoadFrom
注册的消费者是永久的吗?
消费者代码:
public class SendDocumentCommandHandler : Consumes<SendDocumentCommand>.All {
private IServiceBus bus;
public void Consume(SendDocumentCommand message) {
Console.WriteLine("Message of type: {0} has been consumed", message.GetType().Name);
}
public SendDocumentCommandHandler() { }
public SendDocumentCommandHandler(IServiceBus bus) {
this.bus = bus;
}
}
最佳答案
您需要确保 IServiceBus
(IDisposable
)的生命周期不会被 StructureMap 提前结束。在您将 IServiceBus
注入(inject)消费者的地方,很可能在消费者被处置时,总线正在关闭。
所以 container.Inject()
可能需要一些额外的属性来避免它被 StructureMap 处理。
此外,您可以使用 IConsumeContext
获取 IServiceBus
(使用 Bus
属性),因此无需将其注入(inject)消费者。
关于c# - 从程序集加载 MassTransit 消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482741/