MassTransit的内存总线可以跨进程工作吗?

时间:2016-01-04 15:01:40

标签: masstransit

我正在尝试使用MassTransit的内存总线,我尝试修改Loosely Couple Labs Publish/Subscribe Example给出的样本,以便从使用RabbitMQ到内存总线。但是,订户似乎没有收到消息。

我使用的是MassTransit 3.1.2版。

在发布者中,我改变了总线创建:

var bus = Bus.Factory.CreateUsingRabbitMq(x => x.Host(new Uri("rabbitmq://localhost/"), h => { }));

为:

var bus = Bus.Factory.CreateUsingInMemory(x => { });

在订阅者中,我改变了总线创建:

var bus = Bus.Factory.CreateUsingRabbitMq(x =>
    {
        var host = x.Host(new Uri("rabbitmq://localhost/"), h => { });
        x.ReceiveEndpoint(host,
                          "MtPubSubExample_TestSubscriber",
                          e => e.Consumer<SomethingHappenedConsumer>());
    });

为:

var bus = Bus.Factory.CreateUsingInMemory(x => x.ReceiveEndpoint("myQueue",
                                                                 e => e.Consumer<SomethingHappenedConsumer>()));

当我运行此代码时,订阅者控制台应用程序未收到消息。由于我能够在同一个进程中获得环回,这使我相信内存中的总线不会跨进程工作。这是正确的,还是有办法让内存总线在同一台机器上的不同进程之间进行通信?

1 个答案:

答案 0 :(得分:4)

内存中传输仅适用于单个进程。无法使用内存传输在多个进程之间进行通信(即使它们位于同一台计算机上)。

但是,通过配置传输提供程序,可以在同一进程中与多个总线实例共享相同的内存中传输。这在许多单元测试中完成,以验证跨总线实例的行为。

return MassTransit.Bus.Factory.CreateUsingInMemory(x =>
{
    _inMemoryTransportCache = new InMemoryTransportCache(Environment.ProcessorCount);

    x.SetTransportProvider(_inMemoryTransportCache);

    x.ReceiveEndpoint("input_queue", configurator =>
    {
        configurator.Handler<MyMessage>(context => {});
    });
});

可以保存InMemoryTransportCache并将其传递给多个总线实例。同样,这是所有在同一个过程中