我看不出有什么可以说这是正常行为,所以如果我是盲人请见谅。在使用带有请求-响应的 MassTransit 时,我看到了一些奇怪的东西。
所以我在一个服务上有多个消费者,它们监听不同的请求来执行简单的任务,比如从数据库中获取数据。
为了测试每个消费者,我创建了一个控制台应用程序,它为每个消费者执行请求并检查响应。
我注意到的是第一个请求响应工作正常,但是当代码运行下一个检查响应时,响应被接收,但消息随后被移动到跳过的队列并被删除。
这是第二个请求的公共交通日志。
发送
[2021-05-14 10:27:11.812 DBG] (MassTransit.)-发送 rabbitmq://192.168.0.25/Ksrs.Requests:ConceptByConceptNoRequest d9360000-cf5b-480f-418f-08d916ba7421 Ksrs.Requests.ConceptByConceptNoRequest
收到
[2021-05-14 10:28:00.203 DBG] (MassTransit.ReceiveTransport.)-RECEIVE rabbitmq://192.168.0.25/DESKTOP99KLG9M_Tests_bus_5r5yyygxmpry6jgtbdctpqurrb?temporary=true d9360000-cf5b-480f-2626-08 MessageHandler<Ksrs.Response.ConceptResponse>(00:00:00.0004546)
跳过?
[2021-05-14 10:28:41.361 DBG] (MassTransit.ReceiveTransport.)-SKIP rabbitmq://192.168.0.25/DESKTOP99KLG9M_Tests_bus_5r5yyygxmpry6jgtbdctpqurrb?temporary=true d9360000-cf5b-480f-ce25-08df19
不明白skip的时候还是得到响应,响应如预期,代码可以继续。
这是客户端请求和响应代码,对于我的所有检查来说几乎相同。唯一的区别是请求-响应类型。
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;
}
只是一些注释:
使用 Autofac 作为容器。
使用 Serilog 进行日志记录。
使用 RabbitMQ (3.8.16) 作为消息代理。
更新:所以发现了一些有趣的东西。我向每个消费者添加了以下日志记录行,所以我知道正在运行。
Logger.LogInformation("Request for [what ever consumer running goes here]");
现在假设我有 Consumer1、Consumer2 和 Consumer3。我在日志中看到了这一点。
请求消费者 1
SEND blah blah
RECIEVE blah blah
请求消费者 1
请求消费者 2
SEND blah blah
RECIEVE blah blah
请求消费者 1
请求消费者 3
SEND blah blah
RECIEVE blah blah
SEND blah blah
RECIEVE blah blah
所以看起来消费者 1 一直在执行,但我不明白为什么如果每个消费者的消息类型不同并且客户端没有调用它。