【发布时间】:2012-12-07 20:13:45
【问题描述】:
由于某种原因我不能发帖到masstransit google group,即使我加入了,我被告知我没有权限发帖到这个组。所以我要在这里发帖...
现在解决我的问题:
我正在使用 MassTransit v2.7.2 和 AutoFac v2.6.3。我正在尝试配置 Autofac 以扫描程序集并注册我的消费者;所有实现 IConsumer 接口的类型。这似乎有效。
当我配置总线时,我正在使用 MassTransit.AutofacIntegration 程序集和 LoadFrom(...) 扩展方法将容器中的消费者注册到 MassTransit。代码如下:
var builder = new ContainerBuilder();
builder
.RegisterAssemblyTypes(typeof (CreateElectionCommandHandler).Assembly)
.Where(type => type.Implements<IConsumer>())
.AsSelf();
var container = builder.Build();
var localBus = ServiceBusFactory.New(configurator =>
{
//configurator.ReceiveFrom("loopback://localhost/testqueue");
configurator.ReceiveFrom("rabbitmq://localhost/commandqueue");
configurator.UseRabbitMq();
configurator.Subscribe(sbc => sbc.LoadFrom(container));
});
Assert.IsTrue(container.IsRegistered<CreateElectionCommandHandler>());
Assert.IsTrue(container.IsRegistered<TerminateElectionCommandHandler>());
Assert.AreEqual(1, localBus.HasSubscription<CreateElection>().Count());
Assert.AreEqual(1, localBus.HasSubscription<TerminateElection>().Count());
如果我使用环回运行上述代码
configurator.ReceiveFrom("loopback://localhost/testqueue");
配置(注释掉rabbitmq配置),测试通过。
如果我注释掉“环回”配置并在
configurator.ReceiveFrom("rabbitmq://localhost/commandqueue");
configurator.UseRabbitMq();
config,测试将失败。 (注意:rabbitmq 队列已经启动并运行——我一直在使用它作为我的 POC 的一部分)。具体来说,它会在断言上失败:
Assert.AreEqual(1, localBus.HasSubscription<CreateElection>().Count());
Assert.AreEqual(1, localBus.HasSubscription<TerminateElection>().Count());
谁能帮我理解这里发生了什么?我是 MT 的新手,我完全预料到我会遗漏一些东西,或者没有正确配置一些东西。
我是否正确假设如果没有注册消息订阅,那么总线将无法传递给我的任何消费者(即使消费者已注册)?
非常感谢任何帮助!
【问题讨论】:
-
.AsSelf() 注册方式是可行的方法,文档关于注册消费者的 IConsumer 版本是错误的。
标签: rabbitmq autofac masstransit