c# - 从程序集加载 MassTransit 消费者

标签 c# .net masstransit

从程序集加载 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/

相关文章:

biztalk - 使用 BizTalk 代替 NServiceBus 或 MassTransit 的优缺点

dependency-injection - Serilog Sink with MassTransit - IBus 服务解析导致无限循环

c# - 需要使用 func 理解下面的代码

c# - 仅使用 C#/.NET 重命名 .Zip 条目?

c# - 如何在路径上设置渐变动画以在 WPF/WCF 应用程序中可视化数据流

c# - 如何从母版页调用子页的方法?

c# - 如何防止 System.Timers.Timer 在线程池上排队执行?

redis - 使用 redis 集成的公共(public)交通传奇导致异常

c# - 使用 dispose/finalize 模式释放 socket/event/ummaged 代码的正确技术

c# - nhibernate queryOver 投影语法