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

时间:2018-01-02 15:52:38

标签: c# rabbitmq masstransit

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

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

如果我事先了解这些消息,那将很容易;我只想创造一些消费者。不幸的是,事实并非如此。

我尝试了Observers,但如果观察到的总线与发送消息的总线相同,它们似乎只能工作。所以这不会起到跨应用的作用。

rabbit's docs我发现使用兔子MQ绑定会很容易,但似乎不支持这个:Publish message using exchange and routing key using MassTransit

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

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

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

 _bus = Bus.Factory.CreateUsingRabbitMq(cfg =>

1 个答案:

答案 0 :(得分:1)

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

然后,服务可以使用JToken,这会将消息的JSON主体传递给使用者。通过这样做,然后可以随意翻译/存储每条消息。

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

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

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

这应该足以让你入门!