4

由于某种原因,我无法在masstransit google 群组中发帖,即使我加入了,但我被告知我无权在此群组中发帖。所以我要在这里发帖...

现在解决我的问题:

我正在使用 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();

配置,测试将失败。(注意:rabbitmq 队列已经启动并运行——我一直在使用它作为我的 POC 的一部分)。具体来说,它将在断言上失败:

Assert.AreEqual(1, localBus.HasSubscription<CreateElection>().Count());
Assert.AreEqual(1, localBus.HasSubscription<TerminateElection>().Count());

谁能帮我理解这里发生了什么?我是 MT 的新手,我完全预料到我会遗漏一些东西,或者没有正确配置一些东西。

我是否正确假设如果没有注册消息订阅,那么总线将无法交付给我的任何消费者(即使消费者已注册)?

非常感谢任何帮助!

4

2 回答 2

4

使用 RabbitMQ,在发布消息之前不会将订阅添加到出站总线。这是由于如何检查类以及如何创建到适当交换的出站端点并将其添加到管道中。

所以是的,这个测试会在 RabbitMQ 上失败,但实际上当消息发布时它会正常工作。

HasSubscription() 调用实际上是为了验证消费者等是否使用环回传输正确配置,并且实际上只是为了审查不是真正的集成问题而只是确保内部 MassTransit 代码正常工作。

因此,如果您要添加其中一种类型的 Publish() 调用,然后调用 HasSubscription() 扩展方法,它将通过。

于 2012-12-10T01:04:34.260 回答
1

我会检查 MassTransit 是否创建了相关消息类型的交换。消息被发送到交换器,所有消费者队列都绑定到交换器。您可以查看 Rabbit 配置以查看是否也发生了这种情况。如果没有注册消费者,则不会传递任何消息。Chris 一直致力于为错误添加选项,以便您可以在代码中处理它。

我会加入邮件列表https://groups.google.com/forum/?fromgroups=#!forum/masstransit-discuss以获得帮助。有更多的人可以提出正确的问题,以帮助您到达需要的地方。

于 2012-12-08T13:51:58.207 回答