连接总线时断开消费者连接

问题描述 投票:1回答:1

我们有以下用例:

我们有两辆公共汽车(内部和外部)。我们的想法是我们自己的服务使用内部总线,所有第三方服务都使用外部总线。我们创建了一个充当消息路由器的服务(恰当地命名为MessageRouter)。

当消息在内部总线上发布时,MessageRouter可以接收该消息并将其放在外部总线上,反之亦然。通过配置,我们可以判断允许哪些消息从外部传递到外部到内部。这本身就可以。

我们对消息进行了分组,我们有事件,命令和请求。每个服务都有三个ReceiveEnpoints,每个消息类型一个。这意味着所有事件都在事件队列等上排队。服务“订阅”的每条消息都会获得它自己的消费者。

var queues = new Dictionary<string, IEnumerable<Type>>
{
    // ReSharper disable once PossibleMultipleEnumeration
    { "Events", consumerTypes.Where(ct => ct.GetGenericArguments().Any(ga => typeof(IEvent).IsAssignableFrom(ga))) },
    // ReSharper disable once PossibleMultipleEnumeration
    { "Commands", consumerTypes.Where(ct => ct.GetGenericArguments().Any(ga => typeof(ICommand).IsAssignableFrom(ga))) },
    // ReSharper disable once PossibleMultipleEnumeration
    { "Queries", consumerTypes.Where(ct => ct.GetGenericArguments().Any(ga => typeof(IQuery).IsAssignableFrom(ga))) }
};

foreach (var queue in queues)
{
    config.ReceiveEndpoint(GetConsumerQueueName(queue.Key), cfg =>
    {
        foreach (var consumerType in queue.Value)
        {
            cfg.Consumer(consumerType, consumerContainer.Resolve);
        }
        configurator?.Invoke((T)cfg);
    });
}

configIBusFactoryConfigurator的地方。服务启动时调用此代码。

我们希望在MessageRouter中能够“动态”添加,更重要的是,从ReceiveEndpoint中删除使用者。

到目前为止,我们没有任何运气。我们试图通过在ConnectConsumer实例上使用BusControl方法来添加Consumer。这给了我们一个有ConnectHandle方法的Disconnect。但是,使用此方法时,我们的消费者不会收集消息。看看手柄向我们展示它是一个MultipleConnectHandle,但是,手柄没有“内部”手柄。

有没有办法使用Consumer方法注册不同的消费者并获得他们的ConnectHandles,以便我们可以Disconnect消费者,如果需要?

如上所述,理想情况下,我们希望能够动态添加和删除使用者到ReceiveEndpoint。

masstransit
1个回答
0
投票

在总线启动时,您无法在接收端点上添加/删除使用者,也不支持任何方式,形状或形式。

但是,您可以将单个队列上的新接收端点与一个或多个使用者连接。在上面的例子中,您似乎没有在连接接收端点之前注册您的消费者,这就是您在句柄集合中没有看到任何内容的原因。

© www.soinside.com 2019 - 2024. All rights reserved.