private void CheckIfScanNewTable(tb_consumer_partition_model partition, MQIDInfo mqidinfo, string datanodeconnectstring, PartitionIDInfo partionidinfo) { var serverdate = Context.ManageServerTime.AddSeconds(-1);//此处延迟1秒,停顿消费者日分区表之间的切换 if (serverdate != null && serverdate.Date > mqidinfo.Day.Date)//服务器时间和消息时间对应不上 { SqlHelper.ExcuteSql(datanodeconnectstring, (c) => { DateTime t = mqidinfo.Day.Date.AddDays(1); while (serverdate.Date >= t)//查找最后的可用消息表,然后跳出 { string tablename = PartitionRuleHelper.GetTableName(partionidinfo.TablePartition, t); if (exsittablenames.ContainsKey(tablename) || c.TableIsExist(tablename)) { AddExsitTableNameCache(tablename); _lastpullququeiddic[partition.partitionid] = PartitionRuleHelper.GetMQID(new MQIDInfo() { AutoID = 0, DataNodePartition = mqidinfo.DataNodePartition, TablePartition = mqidinfo.TablePartition, Day = t });//重设第二天最小的id break; } t = t.AddDays(1); } }); } }
public virtual tb_consumer_partition_model CreateModel(DataRow dr) { var o = new tb_consumer_partition_model(); // if (dr.Table.Columns.Contains("id")) { o.id = dr["id"].Toint(); } //�����߿ͻ���ID if (dr.Table.Columns.Contains("consumerclientid")) { o.consumerclientid = dr["consumerclientid"].Toint(); } // if (dr.Table.Columns.Contains("partitionindex")) { o.partitionindex = dr["partitionindex"].Toint(); } //������ID if (dr.Table.Columns.Contains("partitionid")) { o.partitionid = dr["partitionid"].Toint(); } // if (dr.Table.Columns.Contains("lastconsumertempid")) { o.lastconsumertempid = dr["lastconsumertempid"].Tolong(); } //������ѵ�MQID if (dr.Table.Columns.Contains("lastmqid")) { o.lastmqid = dr["lastmqid"].Tolong(); } //���������ִ��ʱ��(�Ե�ǰ��ʱ��Ϊ) if (dr.Table.Columns.Contains("lastupdatetime")) { o.lastupdatetime = dr["lastupdatetime"].ToDateTime(); } //�����߷�������ʱ��(�Ե�ǰ��ʱ��Ϊ) if (dr.Table.Columns.Contains("createtime")) { o.createtime = dr["createtime"].ToDateTime(); } return o; }
public virtual bool Add2(DbConn PubConn, tb_consumer_partition_model model) { return SqlHelper.Visit((ps) => { List<ProcedureParameter> Par = new List<ProcedureParameter>() { //�����߿ͻ���ID new ProcedureParameter("@consumerclientid", model.consumerclientid), // new ProcedureParameter("@partitionindex", model.partitionindex), //������ID new ProcedureParameter("@partitionid", model.partitionid), // new ProcedureParameter("@lastconsumertempid", model.lastconsumertempid), //������ѵ�MQID new ProcedureParameter("@lastmqid", model.lastmqid), }; int rev = PubConn.ExecuteSql(@"insert into tb_consumer_partition(consumerclientid,partitionindex,partitionid,lastconsumertempid,lastmqid,lastupdatetime,createtime) values(@consumerclientid,@partitionindex,@partitionid,@lastconsumertempid,@lastmqid,getdate(),getdate())", Par); return rev == 1; }); }
private void ConsumeMessages(List<tb_messagequeue_model> messages, tb_consumer_partition_model partition, MQIDInfo mqidinfo) { long maxmqid = -1; List<MQMessage> mqmessages = new List<MQMessage>(); foreach (var m in messages) { //若是第二天的数据或已迁移的数据则跳过 if ((m.sqlcreatetime < mqidinfo.Day.Date.AddDays(1)) && (m.state == (byte)EnumMessageState.CanRead)) { mqmessages.Add(new MQMessage() { Model = m, Context = Context }); } maxmqid = m.id; } if (mqmessages.Count > 0) { Queue.Enqueue(partition.partitionid, mqmessages); } if (maxmqid > 0) { if (_lastpullququeiddic[partition.partitionid] <= maxmqid && !cancelSource.IsCancellationRequested) _lastpullququeiddic[partition.partitionid] = maxmqid; else throw new BusinessMQException(string.Format("检测到消费者端拉去消息时出现消息乱序问题,partitionid:{0},maxmqid:{1},缓存maxmqid:{2}", partition.partitionid, maxmqid, _lastpullququeiddic[partition.partitionid])); } }
private List<tb_messagequeue_model> GetMessagesOfPatition(tb_consumer_partition_model partition, long scanlastmqid, MQIDInfo mqidinfo, string datanodeconnectstring, PartitionIDInfo partionidinfo) { //从数据库取数据,检查数据时间,和数据状态,无问题则插入队列,并修改上一次扫描的mqid List<tb_messagequeue_model> messages = new List<tb_messagequeue_model>(); SqlHelper.ExcuteSql(datanodeconnectstring, (c) => { string tablename = PartitionRuleHelper.GetTableName(partionidinfo.TablePartition, mqidinfo.Day); if (exsittablenames.ContainsKey(tablename) || c.TableIsExist(tablename)) { AddExsitTableNameCache(tablename); tb_messagequeue_dal dal = new tb_messagequeue_dal(); dal.TableName = tablename; messages = dal.GetMessages(c, scanlastmqid, SystemParamConfig.Consumer_ReceiveMessageQuque_EVERY_PULL_COUNT); } }); return messages; }
public virtual int Edit2(DbConn PubConn, tb_consumer_partition_model model) { return SqlHelper.Visit((ps) => { List<ProcedureParameter> Par = new List<ProcedureParameter>() { //�����߿ͻ���ID new ProcedureParameter("@consumerclientid", model.consumerclientid), // new ProcedureParameter("@partitionindex", model.partitionindex), //������ID new ProcedureParameter("@partitionid", model.partitionid), // new ProcedureParameter("@lastconsumertempid", model.lastconsumertempid), }; int rev = PubConn.ExecuteSql(@"update tb_consumer_partition WITH (ROWLOCK) set partitionindex=@partitionindex, lastconsumertempid=@lastconsumertempid where consumerclientid=@consumerclientid and partitionid=@partitionid", Par); return rev; }); }