我目前正在使用C#核心5.0 REST API和RabbitMQ消息总线。我已经创建了一个从BackgroundService和consumerEmployeeIncomming派生的类。Received事件由消息总线上的消息触发。但是我如何将接收到的数据公开给应用程序的其余部分呢?
该类通过StartUp.cs添加,方法是:服务。AddHostedService();
public class MessageBusSubscriber : BackgroundService
{
private IConfiguration _configuration;
public MessageBusSubscriber(IConfiguration configuration)
{
_configuration = configuration;
RabbitMqUtil.Initialize(_configuration);
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
stoppingToken.ThrowIfCancellationRequested();
if (RabbitMqUtil.IsInitialized)
{
var consumerEmployeeIncomming = new EventingBasicConsumer(RabbitMqUtil.EmployeeChannelIncomming);
consumerEmployeeIncomming.Received += (ModuleHandle, ea) =>
{
Logger.DoLog("CalendarService - MessageBusSubscribe/Employee - event received:");
var body = ea.Body;
var data = Encoding.UTF8.GetString(body.ToArray());
Logger.DoLog(data);
List<EmployeePublishDto> list = JsonSerializer.Deserialize<List<EmployeePublishDto>>(data);
Logger.DoLog("####################################");
Logger.DoLog("Nr of Recieved objects:" + list.Count);
foreach (EmployeePublishDto dto in list)
{
Logger.DoLog(dto.FirstName);
Logger.DoLog(dto.LastName);
Logger.DoLog(dto.Email);
}
};
RabbitMqUtil.EmployeeChannelIncomming.BasicConsume(queue: RabbitMqUtil.EmployeeQueueNameIncomming, autoAck: true, consumer: consumerEmployeeIncomming);
如果不可能,我如何在我的应用程序中继续使用RabbitMQ中的数据?
非常感谢您的建议。
1条答案
按热度按时间qyyhg6bp1#
我仔细阅读了你的评论和代码,我想我可以给你一些启示。
我仍然不能100%确定您想要达到什么目的,但是我 * 认为 * 您想要在队列中完成更改后通知客户端。这里的挑战是后台工作线程实际上是在一个单独的线程中运行的。您不能简单地从一个单独的线程"返回"员工列表。
有几种方法可以解决这个问题,但我会给你最好的两个在我看来。
1.使用webhook通知客户端更改,你可以使用SignalR来完成这一任务。
1.不太好的方法是,您可以简单地将队列移动到"completed"状态,将EmployeeList作为json存储到表中,并在客户端上使用一个单独的端点来轮询队列,检查状态是否完成,如果完成,则获取EmployeeList。