/// <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(); } } } }
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(); } }