好的,所以我有以下问题,这只是一个基本的测试程序,但是我已经很努力了。我对此很陌生,还没有找到类似的情况。
基本上,我需要将消息发布到特定的队列(更深入,但是重点是我们需要固定的拓扑),据我所知,我无法使用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方面都找不到解决方案。
答案 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"
]
}