C# MassTransit-从请求-响应中获取响应正常,但从跳过的队列中添加和删除消息?

C# MassTransit-从请求-响应中获取响应正常,但从跳过的队列中添加和删除消息?,c#,rabbitmq,masstransit,request-response,C#,Rabbitmq,Masstransit,Request Response,我看不到任何东西可以说这是正常行为,所以如果我是盲人,请原谅。lol。我在使用MassTransit和请求-响应时看到了一些奇怪的东西 因此,我在一个服务上有多个消费者,他们监听不同的请求来执行简单的任务,比如从数据库中获取数据 为了测试每个消费者,我创建了一个控制台应用程序,它为每个消费者执行一个请求并检查响应 我注意到的是,第一个请求-响应工作正常,但当代码运行下一个检查时,会收到响应,但消息随后会移动到跳过的队列并被删除 这是第二次请求的masstransit日志 发送 [2021-05-

我看不到任何东西可以说这是正常行为,所以如果我是盲人,请原谅。lol。我在使用MassTransit和请求-响应时看到了一些奇怪的东西

因此,我在一个服务上有多个消费者,他们监听不同的请求来执行简单的任务,比如从数据库中获取数据

为了测试每个消费者,我创建了一个控制台应用程序,它为每个消费者执行一个请求并检查响应

我注意到的是,第一个请求-响应工作正常,但当代码运行下一个检查时,会收到响应,但消息随后会移动到跳过的队列并被删除

这是第二次请求的masstransit日志

发送

[2021-05-14 10:27:11.812 DBG](大众运输公司)-发送rabbitmq://192.168.0.25/Ksrs.Requests:ConceptByConceptNoRequest d9360000-cf5b-480f-418f-08d916ba7421 Ksrs.Requests.ConceptByConceptNoRequest

接收

[2021-05-14 10:28:00.203 DBG](大众运输接收运输)-接收rabbitmq://192.168.0.25/DESKTOP99KLG9M_Tests_bus_5r5yyygxmpry6jgtbdctpqurrb?temporary=true d9360000-cf5b-480f-2626-08d916ba7429 Ksrs.Response.ConceptResponse MassTransit.MessageHandler(00:00:00.0004546)

跳过

[2021-05-14 10:28:41.361 DBG](大众运输接收运输)-跳过rabbitmq://192.168.0.25/DESKTOP99KLG9M_Tests_bus_5r5yyygxmpry6jgtbdctpqurrb?temporary=true d9360000-cf5b-480f-ce25-08d916ba75f3

当我仍然得到响应时,我不理解跳过,响应与预期一样,代码可以继续

这是客户机请求和响应代码,对于我的所有检查来说几乎相同。唯一的区别是请求-响应类型

static async Task<bool> GetByConceptNo(AutofacServiceProvider autoFac, short ksrsId, short conceptNo, ILogger logger)
    {
        var client = autoFac.GetService<IRequestClient<ConceptByConceptNoRequest>>();

        if (client is null) return false;

        Response<ConceptResponse> response;

        try
        {
            response = await client.GetResponse<ConceptResponse>(new ConceptByConceptNoRequest() {KsrsId = ksrsId, ConceptNo = conceptNo});

            logger.LogInformation("Received {Concept}.",response.Message.Concept);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return false;
        }
        return response.Message.Concept is not null;
    }
现在让我们假设我有消费者1、消费者2和消费者3。我在日志中看到了这一点

消费者1的请求
发送废话废话
收到诸如此类的废话
消费者1的请求
消费者2的请求
发送废话废话
收到诸如此类的废话
消费者1的请求
消费者3的请求
发送废话废话
收到诸如此类的废话
发送废话废话
收到废话


因此,似乎Consumer 1一直在执行,但我不明白为什么每个Consumer的消息类型不同,而客户端没有调用它。

MassTransit支持多态消息路由。因此,在上述情况下,如果消费者1使用的消息类型是通过为消费者2或消费者3生成的请求来实现的,那么消费者1将收到该消息的副本,它也将响应该副本

发布请求时(如果未指定特定的目标地址,这是默认设置),确保配置的消息类型只有一个使用者非常重要


多态消息对于事件来说非常有用,因为它很容易通过一个使用者和多个事件类型来提取有趣的事件属性。但是,根据上面看到的情况,最好避免使用命令/请求。或者至少在上述情况下,当发布请求/命令时,使用超类型消息的使用者不应响应,而可能只跟踪/记录/审核命令/请求。

MassTransit支持多态消息路由。因此,在上述情况下,如果消费者1使用的消息类型是通过为消费者2或消费者3生成的请求来实现的,那么消费者1将收到该消息的副本,它也将响应该副本

发布请求时(如果未指定特定的目标地址,这是默认设置),确保配置的消息类型只有一个使用者非常重要


多态消息对于事件来说非常有用,因为它很容易通过一个使用者和多个事件类型来提取有趣的事件属性。但是,根据上面看到的情况,最好避免使用命令/请求。或者至少在上面的情况下,当发布请求/命令时,使用超类型消息的使用者不应该响应,而应该只跟踪/记录/审核命令/请求。

查看跳过的队列,并在RabbitMQ管理控制台中查看消息。正文应该告诉您类型是什么,等等,这可能会给您一些线索。当它们自动删除时,将尝试捕捉其中一个。@ChrisPatterson看了一眼,它让我发现一些奇怪的东西(请参见上面的更新)您是否在消息类型中使用继承?可以,消息是多态的,因此,如果consumerA使用由发送给consumerB或C的消息实现的类型,则a也将使用该类型。查看跳过的队列,并查看RabbitMQ管理控制台中的消息。正文应该告诉您类型是什么,等等,这可能会给您一些线索。当它们自动删除时,将尝试捕捉其中一个。@ChrisPatterson看了一眼,它让我发现一些奇怪的东西(请参见上面的更新)您是否在消息类型中使用继承?可以,消息是多态的,因此,如果consumerA使用发送给consumerB或C的消息所实现的类型,则a也将使用该类型。感谢提供的信息,解决了我的问题。感谢提供的信息,解决了我的问题。
Logger.LogInformation("Request for [what ever consumer running goes here]");