如何将所有已发布的消息从单独的应用程序记录到虚拟主机
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>();
}
这应该足以让您入门!
我有两个应用程序通过 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>();
}
这应该足以让您入门!