/// <summary> /// 此方法统计上一次报告位置到现在确认位置之间的消息并生成报告 /// 此方法本身是线程安全的,但是会影响check方法的状态,所以应该只在单线程中顺序的调用check方法和此方法,或者在外部保持同步。 /// 一般来说应该成对的调用check和report方法 /// </summary> /// <returns>报告</returns> public Report report() { Monitor.Enter(thisLock); try { if (checkedCount == 0) return null; Report report = new Report(); Dictionary<long,string> successMap = new Dictionary<long, string>(); while (reportP != checkP || checkedCount == size) { Message message = messageContent[reportP]; messageContent[reportP] = null; switch (message.state) { case Message.State.SUCCESS: if (successMap.ContainsKey(message.nextOffsetDO.id)) successMap.Remove(message.nextOffsetDO.id); successMap.Add(message.nextOffsetDO.id, message.nextOffset); break; case Message.State.FAILED: case Message.State.UNKNOWN: report.fOffset.Add(message.offset); break; } if (++reportP == size) reportP = 0; --unreportedCount; --checkedCount; } report.sOffset.AddRange(successMap.Values); Monitor.PulseAll(thisLock); return report; } finally { Monitor.Exit(thisLock); } }
public void report(Report report) { IDictionary<string, string> param = new Dictionary<string, string>(); param.Add("report", report.asJson()); param.Add("user_id", "1"); param.Add("topic", "topic"); try { client.Execute("report_message", param, "session"); lastFailedReport = null; } catch (TopException) { lastFailedReport = report; } }