我有一个控制台应用程序正在向RabbitMQ交换发布消息。使用MassTransit构建的订阅者是否可以使用此消息?
这是发布商代码:
public virtual void Send(LogEntryMessage message)
{
using (var connection = _factory.CreateConnection())
using (var channel = connection.CreateModel())
{
var props = channel.CreateBasicProperties();
props.CorrelationId = Guid.NewGuid().ToString();
var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));
channel.BasicPublish(exchange: _endpointConfiguration.Exchange, routingKey: _endpointConfiguration.RoutingKey, basicProperties: null,
body: body);
}
}
这是订阅者代码:
IBusControl ConfigureBus()
{
return Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username(username);
h.Password(password);
});
cfg.ReceiveEndpoint(host, "LogEntryQueue", e =>
{
e.Handler<LogEntryMessage>(context =>
Console.Out.WriteLineAsync($"Value was entered: {context.Message.MessageBody}"));
});
});
}
这是消费者代码:
public class LogEntryMessageProcessor : IConsumer<LogEntryMessage>
{
public Task Consume(ConsumeContext<LogEntryMessage> context)
{
Console.Out.WriteLineAsync($"Value was entered:
{context.Message.Message.MessageBody}");
return Task.FromResult(0);
}
}
答案 0 :(得分:1)
我希望你能在Interoperability部分得到答案,特别是example message。
基本上,您需要根据一些简单的规则构造JSON对象。
示例消息如下所示:
{
"destinationAddress": "rabbitmq://localhost/input_queue",
"headers": {},
"message": {
"value": "Some Value",
"customerId": 27
},
"messageType": [
"urn:message:MassTransit.Tests:ValueMessage"
]
}
通过创建发布者和使用者,运行程序以创建绑定,然后停止使用者并发布一些消息,您可以轻松地检查复杂消息的外观。它们将位于订户队列中,因此您可以使用管理插件轻松读取它们。
答案 1 :(得分:1)
对于MassTransit处理由非MassTransit客户端发布的消息, 消息必须包含MassTransit所需的元数据,如Interoperability页面中所述。 消息的使用者必须处理消息的有效负载。 在下面的代码中,有效负载是LogEntryPayload:
public class LogEntryMessageProcessor : IConsumer<LogEntryPayload>
{
public Task Consume(ConsumeContext<LogEntryPayload> context)
{
//var payload = context.GetPayload<LogEntryPayload>();
Console.Out.WriteLineAsync($"Value was entered: {context.Message.Id} - {context.Message.MessageBody}");
return Task.FromResult(0);
}
}