ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-28 13:00:36  阅读:210  来源: 互联网

标签:photo rabbitmq ABP Coid Rabbitmq message guid SGL


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有