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