我使用 ASP.NET Core WEB API 專案、一些類別庫(域、DI 和 ect)和控制臺應用程式創建了一個解決方案。我用作帶有 Masstransit 庫的 RabbitMQ 消費者的控制臺應用程式,它應該從 RabbitMQ 獲取訊息(我有 Producer 專案,它可以毫無問題地發送 RabbitMQ 訊息)
我的 ConsoleApplication:像這個 Program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddMassTransit(x =>
{
x.AddConsumer<MessageConsumer>();
x.UsingRabbitMq((context, cfg) =>
{
var connectionString = new Uri("RabbitMQ_URL");
cfg.Host(connectionString);
cfg.ConfigureEndpoints(context);
});
});
services.AddMassTransitHostedService(true);
services.AddHostedService<Worker>();
});
}
使用 Worker.cs:
public class Worker : BackgroundService
{
readonly IBus _bus;
public Worker(IBus bus)
{
_bus = bus;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var factory = new ConnectionFactory() { Uri = new
Uri("RabbitMQ_URL"), DispatchConsumersAsync = true };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "MessageQueue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.Received = async (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var @event = JsonConvert.DeserializeObject<Event>
(message);
await _bus.Publish(new Event { DataJson = @event });
await Task.Yield();
};
channel.BasicConsume(queue: "MessageQueue",
autoAck: true,
consumer: consumer);
_logger.LogInformation("Received Text: {Text}", context.Message.DataJson);
return Task.CompletedTask;
}
}
}
訊息消費者.cs:
public class MessageConsumer :
IConsumer<Event>
{
readonly ILogger<MessageConsumer> _logger;
public MessageConsumer(ILogger<MessageConsumer> logger)
{
_logger = logger;
}
public Task Consume(ConsumeContext<Event> context)
{
_logger.LogInInformation("Recieved Text: {Text},
context.Message.DataJson");
return Task.CompletedTask;
}
}
還有我的 Event.cs:
public class Event
{
public ServiceType ServiceType { get; set; }
public string DataJson { get; set; }
}
public enum ServiceType
{
ComplareSitter
}
請幫助我非常感謝。
uj5u.com熱心網友回復:
您可以從使用其中一個 MassTransit 模板的干凈簡單的作業人員服務開始,只是為了驗證您的設定/配置。有一個視頻展示了如何設定和使用模板。
但一個明顯的問題是,你到底為什么要連接到 RabbitMQ 并在Consume方法中創建一個基本的消費者?該訊息已被反序列化為您的Event型別并可以使用。使用 MassTransit 時,絕對不需要在您的應用程式中使用 RabbitMQ 客戶端庫的任何部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/414086.html
標籤:
上一篇:.NETCore3.1-SAP連接器-無法加載型別“System.ServiceModel.Activation.VirtualPathExtension”
