簡體   English   中英

RabbitMQ和MassTransit之間的連接

[英]Connection between RabbitMQ and 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方面,我實際上都陷在這里,找不到解決方案。

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"
    ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM