其他分享
首页 > 其他分享> > ABP默认事务 rabbitmq延迟队列 ABP Rabbitmq

ABP默认事务 rabbitmq延迟队列 ABP Rabbitmq

作者:互联网

1.最近在写ABP 接口调用推送到Rabbitmq的时候发现个问题

发现abp自带事务Update的代码会比Rabbitmq的后执行。导致rabbitmq先执行最新数据,然后被Update接口修改掉了。话不多说直接上思路

我们的需求是,前台提交,标志进行中状态9999,rabbitmq去执行文件处理,处理完毕修改成状态0,rabbitmq 还有个逻辑是有可能没有文件要处理的情况,然后直接修改成状态0,如下代码

 

  public async override Task<PhotoGalleryConfigDto> Update(PhotoGalleryConfigUpdateInput input)
        { 
            photo.SGL_DevicesType = 9999; //默认这个值在上传中

            var newModel = _eventRepository.Update(photo);
       
            //发送处理代码,让消息队列处理请求
            await _publisher.PublishAsync(new SendImageTemplDto { SGL_ImageId = input.SGL_ImageId, TempUrl = photo.SGL_PG_CResourcesFolder, UserId = newModel.SGL_Mem_Cid.ToString(), SGL_Coid = photo.Id, Uid = newModel.SGL_Mem_Cid, DisplayName = newModel.SGL_Mem_DisplayName });
            Logger.Error("编辑了相册ID:" + photo.Id);
            return ObjectMapper.Map<PhotoGalleryConfigDto>(newModel);
        }

 

如下MQ处理代码,下面的代码只是部分逻辑,主要是解决队列延迟的问题即可,否则事务在rabbitmq后执行,导致数据修改后是脏的。

  public Task Handle(SendImageTemplDto message)
        {
            Thread.Sleep(5*1000); // 这里是重点了 目前只是测试,这里延迟执行,前台的service 执行完毕在执行就不会有这个问题了,当然这里只是测试,实际上还是要修改延迟队列的方案来操作
            var guid = Guid.NewGuid().ToString();
//这里判断不能进来多次,避免同样数据资源抢占
            if (!_excutePhotoList.ContainsKey(message.SGL_Coid))
            {
                _excutePhotoList.TryAdd(message.SGL_Coid, message.SGL_Coid); //前台正在裁剪的数据汇总
            }
            else
            {
                LokWriteRunRecord(guid, message.SGL_Coid, "【检测到重复裁剪:】" + JsonConvert.SerializeObject(message) + "===》集合:" + JsonConvert.SerializeObject(_excutePhotoList));
                return Task.CompletedTask;
            }
            try
            {
        
                LokWriteRunRecord(guid, message.SGL_Coid, "【进来了图册ID:】" + message.SGL_Coid + "===》路徑" + UploadFimePaht);
                if (Directory.Exists(UploadFimePaht))
                { 
//这里删除了我自身的逻辑代码
                    DeletePath(UploadFimePaht, message, guid);
                }
                else
                {
                    var sql = $"update table set SGL_DevicesType=0 where SGL_PG_Coid="+ message.SGL_Coid;
                    var exce3 = new DBHelp().ExecuteSql(sql);
                    LokWriteRunRecord(guid, message.SGL_Coid, "【没有新上传的相片:】" + sql + "【受影响行数】" + exce3 + " | " + message.SGL_Coid + "===》路徑" + UploadFimePaht);

                } 
            }
            catch (Exception ex)
            {
                LokWriteRunRecord(guid, message.SGL_Coid, JsonConvert.SerializeObject(message) + "【出错了】" + "【" + guid + "】" + JsonConvert.SerializeObject(ex));
            }
            int coid = 0;
            _excutePhotoList.TryRemove(message.SGL_Coid, out coid);
            return Task.CompletedTask;

        }

 

 

 

标签:photo,rabbitmq,ABP,Coid,Rabbitmq,message,guid,SGL
来源: https://www.cnblogs.com/Mrly/p/16202423.html