MassTransit消耗非MassTransit消息

时间:2017-06-15 20:16:06

标签: rabbitmq masstransit rabbitmq-exchange

我有一个控制台应用程序正在向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);
        }
    }

2 个答案:

答案 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);
    }
}