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); }
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); }
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); }
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); }