C# 从程序集加载MassTransit使用者
从程序集加载MT使用者时(使用C# 从程序集加载MassTransit使用者,c#,.net,masstransit,C#,.net,Masstransit,从程序集加载MT使用者时(使用StructureMapcontainer/MassTransit.StructureMapintegration nuget package),消息得到部分处理:总线处理存储在队列中的消息,之后不响应,尽管您可以看到添加到队列中的消息。然后,如果重新启动应用程序,它将处理队列中等待的消息,并且不再执行任何操作 以下是设置: public class Application { public static void Main() { var
StructureMap
container/MassTransit.StructureMap
integration nuget package),消息得到部分处理:总线处理存储在队列中的消息,之后不响应,尽管您可以看到添加到队列中的消息。然后,如果重新启动应用程序,它将处理队列中等待的消息,并且不再执行任何操作
以下是设置:
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();
}
}
您需要确保StructureMap不会过早结束
IServiceBus
(即IDisposable
)的生命周期。当您将IServiceBus
注入耗电元件时,很可能在处理耗电元件时,总线正在关闭
因此,container.Inject()
可能需要一些附加属性,以避免被StructureMap处理
此外,您还可以使用
IConsumeContext
获取IServiceBus
(使用Bus
属性),因此无需将其注入消费者。是的,LoadFrom
是永久性的。
sbc.Subscribe(x => x.Consumer<SendDocumentCommandHandler>().Permanent());
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;
}
}