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);
        }
Beispiel #2
0
        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);
                    }
                });
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #6
0
        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;
     }));
 }
Beispiel #8
0
        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;
            }));
        }
Beispiel #9
0
        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);
        }