我试图使用消息队列(RabbitMQ)在基于微服务的体系结构中处理请求授权。
根据这些说明,我已经将接收器和发送器配置为。NET核心中的控制台应用程序。但是,当在一个真实的例子中使用它时,我的应用程序接收项目并不是作为使用者收集消息。
我假设我必须在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()
{
}
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();
}
}
@evk提供的答案(在评论中):
“using
是用来处理东西的,当您到达using
块的末尾时,它调用dispose
。basicconsume
不是阻塞调用,因此它开始消耗并立即返回。
在此之后,通道和连接都到达using
块的末尾,并处理它们(处理它们与关闭相同)。”
我想补充以下内容:如果删除使用很容易带来想要的结果,您可以快速尝试。更改以下代码行:
using (var connection = mqFactory.CreateConnection())
var connection = mqFactory.CreateConnection();
起码 Java 是一门优美的编程语言,经过10多年的发展,它几乎已经被应用到了任何地方,在高端的企业服务器上, 手持设备的芯片里,车载设备,智能家电甚至火星车上。在力所能及的情况下,最大限度的提高 Java 开发人员的生产力。
.NET核心和ASP.NET核心到底有什么区别?
我正在尝试使用iTextSharpLGPLv2将HTML文档转换为PDF。核心nuget库。 我面临的问题是,HTMLWorker不再支持iTextSharper。 下面是我的代码。 任何替代iTextSharper的产品。净核心?或者用其他方法来解决这个问题?
SOFARPC 已支持使用 Nacos 作为服务注册中心。假设你已经根据 Nacos 的快速开始在本地部署好 Nacos Server,服务发现的端口默认设置在 8848。 在 SOFARPC 中使用 Nacos 作为服务注册中心只需要在 application.properties 中加入如下配置即可: com.alipay.sofa.rpc.registry.address=nacos://1
使用 Consul 作为服务注册中心需要添加如下依赖 <dependency> <groupId>com.ecwid.consul</groupId> <artifactId>consul-api</artifactId> <version>1.4.2</version> </dependency> 然后在 application.properties 中如下配置: com.alip
使用 Zookeeper 作为服务注册中心只需要在 application.properties 中如下配置即可: com.alipay.sofa.rpc.registry.address=zookeeper://127.0.0.1:2181 注意:考虑掉服务的实时性,以下特性暂不支持 SOFABoot RPC 也提供一个缓存文件(目前暂不支持),当 Zookeeper 不可用时,使用该缓存文件
SOFARPC 已支持使用 SOFARegistry 作为服务注册中心。假设你已经根据 SOFARegistry 的快速开始在本地部署好 SOFARegistry Server,服务发现的端口默认设置在 9603。 在 SOFARPC 中使用 SOFARegistry 作为服务注册中心首先要添加如下的依赖: <dependency> <groupId>com.alipay.sofa</grou
我试着把这个项目作为一个正常的参考。但是在重新构建解决方案之后,控制台应用程序仍然没有将.NET核心库作为参考。