public virtual bool Edit(DbConn PubConn, tb_consumer_partition_model model) { 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), //消费者最后执行时间(以当前库时间为准) new ProcedureParameter("@lastupdatetime", model.lastupdatetime), //消费者分区创建时间(以当前库时间为准) new ProcedureParameter("@createtime", model.createtime) }; Par.Add(new ProcedureParameter("@id", model.id)); int rev = PubConn.ExecuteSql("update tb_consumer_partition set consumerclientid=@consumerclientid,partitionindex=@partitionindex,partitionid=@partitionid,lastconsumertempid=@lastconsumertempid,lastmqid=@lastmqid,lastupdatetime=@lastupdatetime,createtime=@createtime where id=@id", Par); return(rev == 1); }
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); } }); } }
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])); } } }
public tb_consumer_partition_model GetByPartitionId(DbConn conn, int partitionId) { return(SqlHelper.Visit((ps) => { IList <int> list = new List <int>(); string sql = "SELECT top 1 * FROM tb_consumer_partition WITH(NOLOCK) WHERE partitionId=@id"; ps.Add("@id", partitionId); DataTable dt = conn.SqlToDataTable(sql, ps.ToParameters()); tb_consumer_partition_model model = null; if (dt != null && dt.Rows.Count > 0) { model = CreateModel(dt.Rows[0]); } return model; })); }
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); }
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 IList <tb_consumer_partition_model> GetPartitionByConsumerId(DbConn conn, int consumerClientId) { return(SqlHelper.Visit((ps) => { IList <tb_consumer_partition_model> list = new List <tb_consumer_partition_model>(); string sql = "SELECT * FROM tb_consumer_partition WITH(NOLOCK) WHERE consumerclientid=@id"; ps.Add("@id", consumerClientId); DataTable dt = conn.SqlToDataTable(sql, ps.ToParameters()); if (dt != null && dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { tb_consumer_partition_model model = CreateModel(dr); list.Add(model); } } return list; })); }
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; })); }
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; })); }
public virtual bool Add(DbConn PubConn, tb_consumer_partition_model model) { 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), //消费者最后执行时间(以当前库时间为准) new ProcedureParameter("@lastupdatetime", model.lastupdatetime), //消费者分区创建时间(以当前库时间为准) new ProcedureParameter("@createtime", model.createtime) }; int rev = PubConn.ExecuteSql(@"insert into tb_consumer_partition(consumerclientid,partitionindex,partitionid,lastconsumertempid,lastmqid,lastupdatetime,createtime) values(@consumerclientid,@partitionindex,@partitionid,@lastconsumertempid,@lastmqid,@lastupdatetime,@createtime)" , Par); return(rev == 1); }