如何将所有已发布的消息从单独的应用程序记录到虚拟主机

How to log all published messages to a virtual host from a seperate application

我有两个应用程序通过 RabbitMQ 虚拟主机相互通信,使用 Masstransit 作为抽象层。

我正在尝试创建第三个应用程序,它将所有已发布的消息记录到该虚拟主机,但事先并不知道这些消息类型是什么。

如果我事先知道消息,那会很容易;我只会创建一些消费者。不幸的是,情况并非如此。

我尝试了 Observers,但它们似乎只有在观察到的总线与发送消息的总线相同时才有效。所以这对跨应用程序不起作用。

来自rabbit's docs I found this would be easy by using rabbit MQ bindings, but, this does not seem to be supported:

我也尝试过:How to log all Rabbit MQ messages?,但这似乎也是一个死胡同,因为我想以自定义格式将数据记录到数据库中。

看来我漏掉了一件小事,但找了一整天,我没有找到想要的结果。你能让我走上正轨吗?

对于总线配置,在所有 3 个应用程序中我都使用直接配置模式:

 _bus = Bus.Factory.CreateUsingRabbitMq(cfg =>

如果您知道使用服务的队列名称,则可以使用新队列创建新服务,该新队列将明确指定与其他服务队列的交换名称的绑定。这会将传送到该服务的每条消息的副本传送到新服务。

服务然后可以使用 JToken,这会将消息的 JSON 正文传递给消费者。通过这样做,每条消息都可以 translated/stored 随心所欲。

class LogConsumer : IConsumer<JToken> {...}

然后,在您的接收端点中创建绑定:

cfg.ReceiveEndpoint(host, "log-queue", ep =>
{
    ep.Bind("service1-queue");
    ep.Bind("service2-queue");
    ep.Consumer<LogConsumer>();
}

这应该足以让您入门!