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



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

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

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

我尝试了观察者,但它们似乎只有在观察到的总线与发送消息的总线相同时才有效。因此,这不适用于跨应用程序。

从兔子的文档中,我发现使用兔子 MQ 绑定很容易,但是,这似乎不受支持: 使用交换和路由密钥发布消息

使用公共交通我也尝试过:如何记录所有Rabbit MQ消息?,但这似乎也是一个死胡同,因为我想将数据以自定义格式记录到数据库中。

似乎我错过了一件微不足道的事情,但是经过一整天的搜索,我还没有找到想要的结果。你能让我走上正轨吗?

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

_bus = Bus.Factory.CreateUsingRabbitMq(cfg =>

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

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

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

然后,在接收终结点中创建绑定:

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

这应该足以让你开始!

相关内容

最新更新