Example #1
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);
        }
Example #2
0
        private int Consume(PipeWorker workder, bool stop = false)
        {
            int           count = 0;
            StringBuilder sql   = new StringBuilder();

            sql.Append("SELECT TOP 1000 * FROM MQCache WHERE [HasError]=0 AND Enabled=1 ORDER BY [CreateTime] ASC");
            IDBHelper helper = DBFactory.CreateDBHelper();
            DataTable table  = helper.GetTableWithSQL(sql.ToString());

            while (table.Rows.Count > 0)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (stop)
                    {
                        return(count);
                    }
                    string   id       = row["ID"].ToString();
                    string   group    = row["Group"].ToString();
                    Contract contract = new Contract
                    {
                        Command = MessageTypeEnum.Work,
                        Data    = row["Body"].ToString(),
                        Keys    = row["Key"].ToString(),
                        Tags    = row["Tag"].ToString(),
                    };

                    var response = SendMessage(group, contract, workder);
                    if (response.Command == MessageTypeEnum.Error)
                    {
                        StringBuilder update = new StringBuilder();
                        update.Append("UPDATE MQCache SET [HasError]=1,[ErrorMessage]=@Message WHERE ID=@ID");
                        List <Parameter> parameter = new List <Parameter>
                        {
                            new Parameter {
                                Name = "@Message", Value = response.Message
                            },
                            new Parameter {
                                Name = "@ID", Value = id
                            }
                        };
                        helper.ExecNoneQueryWithSQL(update.ToString());
                    }
                    else
                    {
                        StringBuilder delete = new StringBuilder();
                        delete.Append("UPDATE MQCache SET [Enabled]=0 WHERE ID=" + id);
                        helper.ExecNoneQueryWithSQL(delete.ToString());
                        count++;
                    }
                }
                table = helper.GetTableWithSQL(sql.ToString());
            }
            _logger.Write("发送了" + count + "条消费数据到主机");
            return(count);
        }
Example #3
0
        protected Contract SendMessage(string group, Contract contract, PipeWorker worker)
        {
            string      json    = JsonHelper.Serialize(contract);
            var         config  = MQFactory.Consumerconfig.Find(t => t.Group.Equals(group));
            PipeHandler handler = new PipeHandler(worker.Pipe);

            handler.Send(json);
            var responseString = handler.Receive(30);

            if (string.IsNullOrEmpty(responseString))
            {
                throw new TimeoutException("接收消费回执超时");
            }
            var response = JsonHelper.Deserialize <Contract>(responseString);

            return(response);
        }
Example #4
0
        protected ConsumeConcurrentlyStatus Consumer_ConsumeMessage(string group, Message m, PipeWorker worker)
        {
            string   body      = Encoding.UTF8.GetString(m.getBody());
            string   tableName = m.getKeys();
            string   tag       = m.getTags();
            Contract contract  = new Contract
            {
                Data     = body,
                Keys     = tableName,
                Tags     = tag,
                Command  = MessageTypeEnum.Work,
                ThreadID = Thread.CurrentThread.ManagedThreadId,
            };
            var response = SendMessage(group, contract, worker);

            if (response.Command == MessageTypeEnum.Error)
            {
                return(ConsumeConcurrentlyStatus.RECONSUME_LATER);
            }
            _logger.Write("成功接收一条数据,数据:" + body);
            return(ConsumeConcurrentlyStatus.CONSUME_SUCCESS);
        }