代码之家  ›  专栏  ›  技术社区  ›  Stefan

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

  •  0
  • Stefan  · 技术社区  · 7 年前

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

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

    如果我事先知道这些信息,那就很容易了;我只想创造一些消费者。不幸的是,情况并非如此。

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

    rabbit's docs 我发现使用rabbit MQ绑定很容易做到这一点,但这似乎不受支持: Publish message using exchange and routing key using MassTransit

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

    我似乎错过了一件小事,但经过一整天的搜索,我没有找到想要的结果。你能把我带到正确的轨道上吗?

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

     _bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Stefan    7 年前

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

    然后服务可以使用 JToken ,将消息的JSON正文传递给使用者。通过这样做,每一条消息都可以按照您的喜好进行翻译/存储。

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

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

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

    这应该足够让你开始了!