MassTransit 的内存总线能否跨进程工作?

Can MassTransit's In-Memory bus work across processes?

我正在试验 MassT运行sit 的内存总线,我尝试修改 Loosely Couple Labs Publish/Subscribe Example 给出的样本,从使用 RabbitMQ 到内存总线。但是,订阅者似乎没有收到消息。

我正在使用 MassT 的 3.1.2 版本运行sit.

在 Publisher 中,我将总线创建更改为:

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>()));

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

in-memory 传输专为在单个进程中使用而设计。无法使用 in-memory 传输在多个进程之间进行通信(即使它们在同一台机器上)。

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

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

    x.SetTransportProvider(_inMemoryTransportCache);

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

InMemoryTransportCache 可以保存并传递给多个总线实例。同样,这都是 在同一个进程中