Beispiel #1
0
        private void ReviceQueue(string topic)
        {
            string message = null;

            try
            {
                //在队列的头部拿出
                message = Redis.ListLeftPop(topic);
                if (string.IsNullOrEmpty(message))
                {
                    return;
                }

                DataChange data   = message.JsonToObject <DataChange>();
                var        result = _dbTypeMapper.TransferToDb(data);
                if (!result.Success)
                {
                    _logger.LogError($"Topic:{topic},Message:{message},Error:{result.Msg}");
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"Topic:{topic},Message:{message ?? ""}");
            }
        }
Beispiel #2
0
 /// <summary>
 /// 接收消息
 /// </summary>
 /// <param name="message"></param>
 public override void OnReceived(MessageBody message)
 {
     //如果不返回ACK 则 RabbitMQ 不会再发送数据
     message.Consumer.Model.BasicAck(message.BasicDeliver.DeliveryTag, true);
     if (string.IsNullOrEmpty(message.Content))
     {
         return;
     }
     try
     {
         DataChange data   = message.Content.JsonToObject <DataChange>();
         var        result = _dbTypeMapper.TransferToDb(data);
         if (!result.Success)
         {
             OnAction?.Invoke(MessageLevel.Error, $"TransferToDb Error", new Exception(result.Msg));
         }
     }
     catch (Exception ex)
     {
         OnAction?.Invoke(MessageLevel.Error, ex.Message + $"【{message.Content}】", ex);
     }
 }
Beispiel #3
0
        public Task Handle(CanalBody notification)
        {
            var message = notification.Message;

            //过滤
            if (_option.DbTables.Any() && !_option.DbTables.Contains(message.DbName + "." + message.TableName))
            {
                return(Task.CompletedTask);
            }

            var messageStr = JsonConvert.SerializeObject(message);

            Canal.SqlParse.Models.canal.DataChange data = messageStr.JsonToObject <Canal.SqlParse.Models.canal.DataChange>();
            var result = _dbTypeMapper.TransferToDb(data);

            if (!result.Success)
            {
                _logger.LogError($"Topic:{message.CanalDestination+"."+message.DbName+"."+message.TableName},Message:{messageStr},Error:{result.Msg}");
            }

            notification.Succ = true;
            return(Task.CompletedTask);
        }
Beispiel #4
0
        public Task Handle(CanalBody body)
        {
            var       notificationList = body.Message;
            var       metric           = new Dictionary <string, MetricCount>();
            Stopwatch stopwatch        = new Stopwatch();

            stopwatch.Start();
            foreach (var message in notificationList)
            {
                //过滤
                if (_option.DbTables != null && !_option.DbTables.Contains(message.DbName + "." + message.TableName))
                {
                    IncrementMetric(metric, message, false);
                    continue;
                }

                var result = _dbTypeMapper.TransferToDb(message);
                if (!result.Success)
                {
                    _logger.LogError($"Topic:{message.CanalDestination + "." + message.DbName + "." + message.TableName},Message:{Newtonsoft.Json.JsonConvert.SerializeObject(message)},Error:{result.Msg}");
                }
                else
                {
                    IncrementMetric(metric, message);
                }
            }
            stopwatch.Stop();
            var doutime = (int)stopwatch.Elapsed.TotalSeconds;
            var time    = doutime > 1 ? ParseTimeSeconds(doutime) : stopwatch.Elapsed.TotalMilliseconds + "ms";

            _logger.LogInformation($"【batchId:{body.BatchId}】processTime:{time}");
            foreach (var item in metric)
            {
                _logger.LogInformation($"batchId:{body.BatchId},process:{this.GetType().FullName},target:{item.Key},total:{item.Value.Total},success:{item.Value.SuccCount}");
            }
            return(Task.CompletedTask);
        }