我正在尝试使用消息队列(RabbitMQ)处理微服务架构中的请求授权。我已经按照这些说明在.NET Core控制台应用程序中成功配置了接收器和发送器。但是,在实际应用示例中,我的接收项目未作为消费者收集消息。我认为我必须在
Startup.cs
中注册消费者,但我似乎无法使其工作。我的消费者/响应者代码:public class RabbitMqHandler
{
private readonly IJWTFactory _jwtFactory;
public RabbitMqHandler(IJWTFactory jWTFactory)
{
_jwtFactory = jWTFactory;
}
public void Register()
{
var mqFactory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = mqFactory.CreateConnection())
{
Console.WriteLine("Listening on Rabbit MQ");
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "Authorize", durable: false, exclusive: false, autoDelete: false, arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var jwtToken = Encoding.UTF8.GetString(body);
Console.WriteLine("Rceived Message");
var validatedToken = _jwtFactory.ValidateTokenSignature(jwtToken);
SendResponse(validatedToken);
};
channel.BasicConsume(queue: "Authorize", autoAck: true, consumer: consumer);
}
}
}
public void Deregister()
{
}
Startup.cs
用于注册 .AddSingleton()
编辑:我已经添加了一些额外的监听代码,这肯定是在启动时运行的,但是RabbitMQ没有将应用程序显示为消费者或通道:
public static class ApplicationBuilderExtentions
{
public static RabbitMqHandler Listener { get; set; }
public static IApplicationBuilder UseRabbitListener(this IApplicationBuilder app)
{
Listener = app.ApplicationServices.GetService<RabbitMqHandler>();
var life = app.ApplicationServices.GetService<IApplicationLifetime>();
life.ApplicationStarted.Register(OnStarted);
//press Ctrl+C to reproduce if your app runs in Kestrel as a console app
life.ApplicationStopping.Register(OnStopping);
return app;
}
private static void OnStarted()
{
Listener.Register();
}
private static void OnStopping()
{
Listener.Deregister();
}
}
总结一下:
- 如何在 .NET Core 中正确配置消费者以消费消息?
- 这只是期望消息队列管理请求/响应式通信的错误方法吗?
- 我应该仅使用 API 调用来验证和授权用户吗?
consumer.Received
从未触发吗? - Evkchannel.basicConsume
是否起作用。 - Dandyconnection
和channel
移到RabbitMqHandler
类的字段中,并在Unregister
而不是在Register
中关闭它们。 - EvkBasicConsume
还是因为using
? - Dandy