![](/img/trans.png)
[英]How to change RabbitMq informations after start a connection using 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.