【问题标题】:Bus Configuration with Autofac: Issue with RabbitMQ vs Loopback?使用 Autofac 进行总线配置:RabbitMQ 与 Loopback 的问题?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 道歉 - 由于假期延迟回复。感谢@Chris Patterson 的解释;在总线上添加对 Publish() 的调用(使用 RabbitMQ 配置)导致测试通过。
【解决方案2】:

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

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

【讨论】:

  • 然后我可以轻松地从我的回复中删除它。谢谢克里斯。
  • 谢谢@Travis - 我实际上已经加入了那个小组,但由于某种原因,我被告知我没有发布权限 - 任何想法为什么会这样?
  • Google Groups 似乎又一次失去了新用户的审核标志,并且在他们加入后将其屏蔽。我会试着把它清理干净。
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2019-04-09
相关资源
最近更新 更多