企企云ERP OpenAPI接口--.Net Core AWS SQS队列读取实现(基于abp框架的一种实现)

在企企云的open api开发当中,订阅实体的cud事件后,订阅对象会把消息放到AWS SQS队列中,该队列采用AWS的标准队列,消息保证会发送一次(反过来说可能会发送多次,处理时需要注意下)。

在处理AWS 队列,AWS给的.net 代码示例用了简单的控制台死循环,实际项目中可以使用一个独立的线程来处理,可以采用订阅模式,这个线程在读取SQS队列的信息后发布event。由订阅event的其他线程来做业务方面的处理。

由于我的代码使用abp框架,所以我使用了AbpBackgroundWorker来处理,在订阅模式方面abp提供了eventbus来处理event。原理还是那个原理,就是abp框架提供了便利。

里面需要注意的点有:

  1. 在Worker的StartAsync方法中,不要 await localEventBus.PublishAsync,否则会等待eventbus处理完后才会继续进行,这可能造成线程死掉(这里不做详细的分析了)。示例代码如下:

 while (true)
                {
                  

                    var msg = await GetMessage(sqsClient, queueUrl, 10);
                  
                    if (msg != null && msg.Messages.Count != 0)
                    {

                       var msgData =msg.Messages.Select(msg => JsonConvert.DeserializeObject<Q7hubSqsEvent>(msg.Body));

                        //抛出数据,不要await
                         localEventBus.PublishAsync(msgData);

                        //删除已经处理的数据,不要await
                         DeleteMessage(sqsClient, msg.Messages, queueUrl);

                    }
                }

  1. 由于sqs队列可能会重复发送信息,并且由于单据会在几秒内发生多次状态的变化而等待SQS队列的长轮询是有等待事件的,可能在一次读取中遇到单据的信息是冗余和无效的。需要换个思路——只保留实体ID,具体的内容主动去查询。(注意:billTypeId: 单据类型ID,仅在单据时有值;billTypeCode: 单据类型编码, 仅在单据时有值。)示例代码如下:

 var ids = eventData.Where(e=>e.objectName=="Project"&&!string.IsNullOrEmpty(e.billTypeId)&&e.billTypeId== "QT3GHL501QD0001").GroupBy(e => e.objectId).Select(eventData => eventData.Key).ToList();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值