Beispiel #1
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);
                        }
                    });
            }
        }
        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;
            });
        }
Beispiel #4
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]));
     }
 }
Beispiel #5
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 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;
            });
        }