コード例 #1
0
 /// <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);
     }
 }
コード例 #2
0
 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;
     }
 }