Пример #1
0
 public TableWatcher(TableConfig config, ChainwayMQConfig mqconfig, ChainwayProducer producer)
     : base(config, mqconfig)
 {
     _producer = producer;
     _sender   = producer;
     _helper.AutoCloseConnection = false;
 }
Пример #2
0
        private void StartProducer(ChainwayMQConfig config)
        {
            var producer = MQFactory.CreatePushComsumer(config)[0];

            producer.ConsumeMessage += Producer_ConsumeMessage;
            producer.Start();
        }
Пример #3
0
 public BaseWatcher(TableConfig tableconfig, ChainwayMQConfig mqconfig)
 {
     _mqConfig    = mqconfig;
     _tableconfig = tableconfig;
     if (mqconfig != null && mqconfig.Top > 0)
     {
         _topn = mqconfig.Top;
     }
 }
Пример #4
0
        protected int StartConsumer(ChainwayMQConfig config, PipeWorker worker)
        {
            ChainwayPullConsumer consumer;
            int count = 0;

            config.Topic.ForEach(p =>
            {
                if (!_consumerDic.ContainsKey(config.Group))
                {
                    consumer = MQFactory.CreatePullComsumer(config.Group, config.Address, -1);
                    _consumerDic[config.Group] = consumer;
                }
                else
                {
                    consumer = _consumerDic[config.Group];
                }
                if (!consumer.Connected)
                {
                    consumer.Start();
                }
                var messages     = consumer.fetchSubscribeMessageQueues(p);
                var messagesTemp = messages.toArray();
                long offset      = 0;
                foreach (MessageQueue queue in messagesTemp)
                {
                    offset = consumer.fetchConsumeOffset(queue, true);
                    if (offset < 0)
                    {
                        offset = 0;
                    }
                    var result = consumer.pull(queue, "*", offset, 10000);
                    if (result.getPullStatus() != PullStatus.FOUND)
                    {
                        continue;
                    }
                    var list = result.getMsgFoundList()?.toArray();
                    if (list == null)
                    {
                        continue;
                    }
                    foreach (Message item in list)
                    {
                        if (Consumer_ConsumeMessage(consumer.getConsumerGroup(), item, worker) == ConsumeConcurrentlyStatus.CONSUME_SUCCESS)
                        {
                            count++;
                            consumer.UpdateOffset(queue, offset + 1);
                            offset = result.getNextBeginOffset();
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            });
            return(count);
        }
Пример #5
0
 public void StartConsumer(ChainwayMQConfig config)
 {
     _consumer = MQFactory.CreatePushComsumer(config);
     _consumer.ForEach(t =>
     {
         t.ConsumeMessage += Consumer_ConsumeMessage;
         _logger.Write(t.getNamesrvAddr());
         t.start();
     });
 }
Пример #6
0
        private void StartWatcher(ChainwayMQConfig t, ref int count)
        {
            while (true)
            {
                if (Stop)
                {
                    break;
                }
                _logger.Write("正在准备连接服务器:" + t.ProxyIP);
                var config = _manager.Config.Find(p => p.Host.Equals(t.ProxyIP));
                var worker = _manager.GetWorker(config);
                try
                {
                    var hanlder = new PipeHandler(worker.Pipe);
                    _workerDic[t.ProxyIP] = hanlder;
                    _logger.Write("已连接,准备完成");
                    Ready(hanlder);
                    _logger.Write("开始接收消息队列数据");
                    count = Consume(worker, Stop);
                    _logger.Write("处理消息队列结束,准备发送结束信息");
                    SendFinish(hanlder);
                    _logger.Write("服务器:" + t.ProxyIP + "发送了" + count.ToString() + "条消费消息");
                    _logger.Write("接收消息队列数据结束");

                    var produceconfig = MQFactory.Producerconfig.Find(p => p.ProxyIP.Equals(t.ProxyIP));
                    count = ReceiveMsg(hanlder, produceconfig, Stop);
                    _logger.Write("从服务器:" + produceconfig.ProxyIP + "接受了" + count.ToString() + "生产消息,并推送到消息队列");
                }
                catch (SocketException ex)//发生socket异常,重连
                {
                    _logger.WriteException(ex);
                    Thread.Sleep(1000 * 10);
                    worker.Close();
                    _manager.InitWorker();
                }
                catch (TimeoutException ex)//发生超时异常,重连
                {
                    _logger.WriteException(ex);
                    Thread.Sleep(1000 * 10);
                    worker.Close();
                    _manager.InitWorker();
                }
                catch (Exception ex)
                {
                    _logger.WriteException(ex);
                    _manager.InitWorker();
                }

                Thread.Sleep(1000 * 5);
            }
        }
Пример #7
0
        protected int ReceiveMsg(PipeHandler worker, ChainwayMQConfig config, bool stop = false)
        {
            int count = 0;

            while (true)
            {
                if (stop)
                {
                    break;
                }
                string json = worker.Receive(120);
                if (string.IsNullOrEmpty(json))
                {
                    throw new TimeoutException("接收主机信息超时");
                }
                Contract data = JsonHelper.Deserialize <Contract>(json);
                switch (data.Command)
                {
                case MessageTypeEnum.Work:
                    Contract result = new Contract();
                    try
                    {
                        ChainwayProducer producer = GetProducer(config.Group, config.Address);
                        foreach (var t in config.Topic)
                        {
                            ChainwayMessage msg = new ChainwayMessage(t);
                            msg.setKeys(data.Keys);
                            msg.setTags(data.Tags);
                            msg.Body = data.Data;
                            producer.send(msg);
                            count++;
                            _logger.Debug(string.Format("表{0}成功推送1条数据到消息队列,json:{1}", data.Keys, data.Data));
                        }
                        result.Command = MessageTypeEnum.OK;
                    }
                    catch (Exception ex)
                    {
                        result.Command = MessageTypeEnum.Error;
                        result.Message = ex.Message;
                        _logger.WriteException(ex);
                    }
                    worker.Send(result);
                    break;

                case MessageTypeEnum.End:
                    return(count);
                }
            }
            return(count);
        }
Пример #8
0
        public void StartTableWatcher(ChainwayMQConfig mqconfig)
        {
            if (_producer == null)
            {
                _logger.Write("准备监听mq");
                _producer = MQFactory.CreateProducer();
                _producer.start();
                _logger.Write("mq监听完毕");
            }
            _logger.Write("准备进入循环");
            while (true)
            {
                foreach (var c in config)
                {
                    try
                    {
                        //替换表名中的日期占位符
                        if (_tasks.ContainsKey(c.IDOrTableName))
                        {
                            continue;
                        }
                        _logger.Write(string.Format("数据监视器正在启动,以监视表:{0}", c.IDOrTableName));
                        Task t = new Task(() =>
                        {
                            try
                            {
                                TableWatcher watcher    = new TableWatcher(c, mqconfig, _producer);
                                _tasks[c.IDOrTableName] = watcher;
                                watcher.Start();
                            }
                            catch (Exception ex)
                            {
                                _logger.WriteException(ex);
                            }
                        });
                        t.Start();

                        _logger.Write(string.Format("数据监视器正在监视表:{0}", c.IDOrTableName));
                    }
                    catch (Exception ex)
                    {
                        _logger.WriteException(ex);
                    }
                }
                //休眠一小时
                Thread.Sleep(1000 * 60 * 60);
            }
        }