1.升级了masstransit的包版本到7.1.8,低版本的nuget包在接收消息时必须封装消息成如下格式,
{
"messageId": "f38c0000-76ed-beef-e12d-08d9a8ddd8e8",
"conversationId": "f38c0000-76ed-beef-e246-08d9a8ddd8e8",
"sourceAddress": "",
"destinationAddress": "",
"messageType": [
"urn:message:Test.Messages:TestMessage"
],
"message": {
"Id": null,
"Name": "123"
},
"sentTime": "2021-11-16T08:48:23.0015277Z",
"headers": {},
"host": {
"machineName": "",
"processName": "",
"processId": 1,
"assembly": "",
"assemblyVersion": "1.0.0.0",
"frameworkVersion": "4.0.30319.42000",
"massTransitVersion": "",
"operatingSystemVersion": "Unix 3.10.0.1160"
}
}
如果交互的系统没有使用masstransit框架,封装成这种格式很麻烦,升级masstransit相关的包版本后,在交互时简化了消息的封装,最小的消息体格式如下:
{
"message": {
"value": "Some Value",
"customerId": 27
},
"messageType": [
"urn:message:MassTransit.Tests:ValueMessage"
]
}
2.配置(两种方式)
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
// 定义需要启动的队列、可启动多个
cfg.ReceiveEndpoint("event-listener", e =>
{
e.Consumer<EventConsumer>();
});
});
await busControl.StartAsync(source.Token);
configure.UsingRabbitMq((context, cfg) =>
{
cfg.ReceiveEndpoint("event-listener", e =>
{
e.Consumer<EventConsumer>(context);
});
});
第一种是官方给出的控制台服务的配置方式,需要手动将IBusControl和IBus注入。第二种方式默认将下面五个接口注入到容器中。
这两种注入方式都是在bus启动之前指定要启动的队列名,如果需要在bus启动之后启动新的消息队列,通过IReceiveEndpointConnector接口创建连接,这是只能通过上述的第二种配置方式。
var connector = service.GetRequiredService<IReceiveEndpointConnector>();
var handle = connector.ConnectReceiveEndpoint("new-listener", (context, cfg) =>
{
cfg.ConfigureConsumer<EventConsumer>(context);
});
await handle.Ready;