コード例 #1
0
 /// <summary>
 /// 发送消息到 aliMQ,同时修改系统发送状态
 /// </summary>
 /// <param name="sysMQ">系统MQ消息记录</param>
 public void SendMessage(SysMessageQueue sysMQ)
 {
     using (SqlConnection connection = DBConnectionMgr.GetUserConnection())
     {
         using (SqlTransaction transaction = connection.BeginTransaction())
         {
             SysMessageQueueDbSvc sysMQDbSvc = new SysMessageQueueDbSvc(connection);
             sysMQ.Status = OnsMQDefine.SysMessage_Status_Sent;
             sysMQDbSvc.UpdateStatus(sysMQ, transaction);
             //根据 Key 查询,如果OnsMQ服务器上补存在消息,重发
             //if (string.IsNullOrEmpty(GetMessageByKey(sysMQ.Keys)))
             //{
             //发送消息
             if (SendMessageToAliMQ(sysMQ.MsgCont, sysMQ.Tags, sysMQ.Keys))
             {
                 transaction.Commit();
             }
             else
             {
                 transaction.Rollback();
             }
             //}
             //else { transaction.Commit(); }
         }
     }
 }
コード例 #2
0
        public void PullMessage()
        {
            List <OnsConsumerResult> list = PullMessageFromAli();

            while (list.Count > 0)
            {
                Dictionary <string, SysMessageQueue> sysMQDict       = new SysMessageQueueDbSvc().ListByKeyList(list.Select(t => t.key).ToList()).ToDictionary(t => t.Keys);
                Dictionary <string, SysConsumer>     sysConsumerDict = new SysConsumerDbSvc().ListByKeyList(ConsumerID, list.Select(t => t.key).ToList()).ToDictionary(t => t.Keys);

                foreach (var msg in list)
                {
                    string msgKey = msg.key;
                    //发送消息表,一定存在这条数据,如果不存在一定是非法添加消息
                    SysMessageQueue sysMQ;
                    if (!sysMQDict.TryGetValue(msgKey, out sysMQ))
                    {
                        continue;//非法消息
                    }

                    SysConsumer consumer;
                    //如果数据库记录已经消费,则执行消费阿里云 MQ 消费,删除消息。
                    if (sysConsumerDict.TryGetValue(msgKey, out consumer))
                    {
                        DeleteMessage(msg.msgHandle);
                        continue;
                    }

                    //客户消费消息,写入数据库记录
                    using (SqlConnection connection = DBConnectionMgr.GetUserConnection())
                    {
                        using (SqlTransaction transaction = connection.BeginTransaction())
                        {
                            try
                            {
                                consumer = new SysConsumer()
                                {
                                    SysMsgID   = sysMQ.Id,
                                    Keys       = msgKey,
                                    MQMsgID    = msg.msgId,
                                    MsgCont    = sysMQ.MsgCont,
                                    ConsumerID = ConsumerID
                                };

                                SysConsumerDbSvc dbSvc = new SysConsumerDbSvc(connection);
                                dbSvc.Insert(consumer, transaction);
                                transaction.Commit();

                                if (DeleteMessage(msg.msgHandle))
                                {
                                    Console.WriteLine(consumer.ConsumerID + sysMQ.MsgCont);
                                }
                            }
                            catch (SqlException ex)
                            {
                                //如果数据库已经存在,抛出重复插入异常
                                if (ex.ErrorCode == ErrorCode_Duplicate)
                                {
                                    DeleteMessage(msg.msgHandle);
                                }
                            }
                        }
                    }
                }
                //批处理,一次读取32
                list = PullMessageFromAli();
            }
        }