rabbitmq 从C#核心rest api BackgroundService回调或事件/委托

pxq42qpu  于 2022-11-23  发布在  RabbitMQ
关注(0)|答案(1)|浏览(210)

我目前正在使用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中的数据?
非常感谢您的建议。

qyyhg6bp

qyyhg6bp1#

我仔细阅读了你的评论和代码,我想我可以给你一些启示。
我仍然不能100%确定您想要达到什么目的,但是我 * 认为 * 您想要在队列中完成更改后通知客户端。这里的挑战是后台工作线程实际上是在一个单独的线程中运行的。您不能简单地从一个单独的线程"返回"员工列表。
有几种方法可以解决这个问题,但我会给你最好的两个在我看来。
1.使用webhook通知客户端更改,你可以使用SignalR来完成这一任务。
1.不太好的方法是,您可以简单地将队列移动到"completed"状态,将EmployeeList作为json存储到表中,并在客户端上使用一个单独的端点来轮询队列,检查状态是否完成,如果完成,则获取EmployeeList。

相关问题