RabbitMQ和MassTransit之间的连接

时间:2018-08-23 12:45:18

标签: c# rabbitmq masstransit

好的,所以我有以下问题,这只是一个基本的测试程序,但是我已经很努力了。我对此很陌生,还没有找到类似的情况。

基本上,我需要将消息发布到特定的队列(更深入,但是重点是我们需要固定的拓扑),据我所知,我无法使用MassTransit做到这一点。

我现在的想法是使用裸RabbitMQ将消息发布到队列,然后使用MassTransit从该队列中读取消息。

所以我现在有2个非常基本的控制台应用程序,其中TestPublisher是仅使用RabbitMQ的发布者,而TestSubscriber是使用MassTransit的使用者。

TestPublisher:

Program.cs

using System;
using RabbitMQ.Client;
using System.Text;
using TestPublisher;

class Program
{
    public static void Main()
    {
        var factory = new ConnectionFactory() { HostName = "localhost", VirtualHost = "testvhost" };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {


            var message = new TestMessage(){ message = "Test"};
            var body = Encoding.UTF8.GetBytes(message.message);

            channel.BasicPublish(exchange: "MTQueue", routingKey: "MTQueue", basicProperties: null, body: body);
            Console.WriteLine(" [x] Sent {0}", message);
        }

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }
}

TestMessage.cs

using Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestPublisher
{
    class TestMessage : MessageDelivery
    {
        public string message { get; set; }

    }
}

TestSubscriber

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MassTransit;
using MassTransit.Log4NetIntegration.Logging;

namespace TestSubscriber
{
    class Program
    {
        static void Main(string[] args)
        {
            Log4NetLogger.Use();
            var bus = Bus.Factory.CreateUsingRabbitMq(x =>
            {
                var host = x.Host(new Uri("rabbitmq://localhost/testvhost/"), h => { });
                x.ReceiveEndpoint(host, "MTQueue", e => e.Consumer<TestMessageConsumer>());
            });
            bus.Start();
            Console.ReadKey();
            bus.Stop();

        }
    }
}

TestMessageConsumer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Contracts;
using MassTransit;

namespace TestSubscriber
{
    class TestMessageConsumer : IConsumer<MessageDelivery>
    {
        public Task Consume(ConsumeContext<MessageDelivery> context)
        {
            Console.Write("TEXT: " + context.Message);
            Console.Write(" VERARBEITET: " + DateTime.Now);
            Console.WriteLine(" (" + System.Threading.Thread.CurrentThread.ManagedThreadId + ")");
            return Task.FromResult(0);
        }
    }
}

合同

Contracts.cs

using System;

namespace Contracts
{
    public interface MessageDelivery
    {
        string message { get; }
    }
}

我可以使用TestPublisher毫无问题地发布到队列中,消息将在正确的队列中,使用RabbitMQ管理界面进行验证。

我现在的问题是,因为RabbitMQ只允许我使用BasicPublish发布字节数组,所以我无法使用TestSubscriber从队列中获取消息,因为消费者希望消息的类型为MessageDelivery,并且不会我将ConsumeContext或IConsumer配置为侦听byte []

我真的被困在这里,在RabbitMQ方面或MassTransit方面都找不到解决方案。

1 个答案:

答案 0 :(得分:1)

MassTransit使用JSON序列化,并且期望消息采用预定义的格式。您描述的用例不是针对MassTransit的用途。但是,如果要这样做,请检查文档中的“互操作性”部分:http://masstransit-project.com/MassTransit/advanced/interoperability.html

以下是示例消息(JSON有效负载):

{
    "destinationAddress": "rabbitmq://localhost/input_queue",
    "headers": {},
    "message": {
        "value": "Some Value",
        "customerId": 27
    },
    "messageType": [
        "urn:message:MassTransit.Tests:ValueMessage"
    ]
}