ApiReporter.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. using System;
  2. using Top.Api.Util;
  3. using System.Threading;
  4. using System.Collections.Generic;
  5. using Top.Api.Security;
  6. using System.Text;
  7. namespace Top.Api.Report
  8. {
  9. public class ApiReporter
  10. {
  11. private static readonly ITopLogger Log = Top.Api.Log.Instance;
  12. private static readonly object InitSecretLock = new object();
  13. private static readonly int SleepTime = 1000 * 60 * 1;
  14. private static readonly int FlushInterval = 1000 * 60 * 5;// 5分钟
  15. private static readonly int MinFlushInterval = 1000 * 60 * 1;// 1分钟
  16. private static readonly string AppSecretType = "2";
  17. private static readonly string AppUserSecretType = "3";
  18. private static readonly IDictionary<string, object> AppInitStatus = new Dictionary<string, object>();
  19. private DefaultTopClient topClient;
  20. public void InitSecret(DefaultTopClient defaultTaobaoClient)
  21. {
  22. string appkey = defaultTaobaoClient.appKey;
  23. this.topClient = defaultTaobaoClient;
  24. lock (InitSecretLock)
  25. {
  26. if (AppInitStatus.ContainsKey(appkey))
  27. {
  28. return;
  29. }
  30. InitSecretThread();
  31. AppInitStatus.Add(appkey, true);
  32. }
  33. }
  34. private void InitSecretThread()
  35. {
  36. Thread uploadThread = new Thread(o =>
  37. {
  38. DoUploadBiz();
  39. });
  40. uploadThread.IsBackground = true;
  41. uploadThread.Name = "flushSecretApiReporter-thread";
  42. uploadThread.Start();
  43. }
  44. private void DoUploadBiz()
  45. {
  46. long uploadTime = TopUtils.GetCurrentTimeMillis() + FlushInterval;
  47. while (true)
  48. {
  49. try
  50. {
  51. Thread.Sleep(SleepTime);
  52. IDictionary<string, Counter> appUserCounterMap = SecurityCounter.GetUserCounter(topClient.appKey);
  53. if (TopUtils.GetCurrentTimeMillis() >= uploadTime || (appUserCounterMap.Count * 4 > 65536))
  54. {
  55. StringBuilder counterBuilder = new StringBuilder();
  56. IDictionary<string, Counter> cloneAppUserCounter = SecurityCounter.CloneUserCounter(topClient.appKey);
  57. SecurityCounter.CleanUserCounter(topClient.appKey);
  58. int count = 0;
  59. foreach (KeyValuePair<string, Counter> currentPair in cloneAppUserCounter)
  60. {
  61. Counter counter = currentPair.Value;
  62. if (counterBuilder.Length > 0)
  63. {
  64. counterBuilder.Append(";");
  65. }
  66. counterBuilder.Append(currentPair.Key);
  67. GenerateCounter(counterBuilder, counter);
  68. if ((++count) % 100 == 0)
  69. {
  70. DoUpload(counterBuilder.ToString(), AppUserSecretType);
  71. counterBuilder = new StringBuilder();
  72. }
  73. }
  74. if (counterBuilder.Length > 0)
  75. {
  76. DoUpload(counterBuilder.ToString(), AppUserSecretType);
  77. counterBuilder = new StringBuilder();
  78. }
  79. Counter appCounter = SecurityCounter.GetAppCounter(topClient.appKey);
  80. counterBuilder.Append(SecurityCore.GetAppUserSecretCache().Count);
  81. GenerateCounter(counterBuilder, appCounter);
  82. appCounter.Reset();
  83. long uploadInterval = DoUpload(counterBuilder.ToString(), AppSecretType);
  84. uploadTime = TopUtils.GetCurrentTimeMillis() + uploadInterval;
  85. }
  86. }
  87. catch (Exception e)
  88. {
  89. Log.Error(string.Format("flushSecretApiReporter error: {0}", e.Message));
  90. }
  91. }
  92. }
  93. private IDictionary<string, Counter> CloneAppUserCounter(IDictionary<string, Counter> sourceDictionary)
  94. {
  95. IDictionary<string, Counter> targetDictionary = new Dictionary<string, Counter>();
  96. foreach (KeyValuePair<string, Counter> currentPair in sourceDictionary)
  97. {
  98. targetDictionary.Add(currentPair.Key, currentPair.Value);
  99. }
  100. return targetDictionary;
  101. }
  102. private int DoUpload(string contentJson, string type)
  103. {
  104. int uploadInterval = FlushInterval;
  105. TopSdkFeedbackUploadRequest request = new TopSdkFeedbackUploadRequest();
  106. request.Type = type;
  107. request.Content = contentJson;
  108. TopSdkFeedbackUploadResponse response = topClient.Execute(request, null);
  109. if (!response.IsError)
  110. {
  111. uploadInterval = response.UploadInterval;
  112. if (uploadInterval < MinFlushInterval)
  113. {
  114. uploadInterval = FlushInterval;
  115. }
  116. }
  117. return uploadInterval;
  118. }
  119. private void GenerateCounter(StringBuilder counterBuilder, Counter counter)
  120. {
  121. // encrypt
  122. if (counterBuilder.Length > 0)
  123. {
  124. counterBuilder.Append(",");
  125. }
  126. if (SecurityCounter.GetAppCounter(topClient.appKey).GetEncryptPhoneNum() != 0)
  127. {
  128. counterBuilder.Append(counter.GetEncryptPhoneNum());
  129. }
  130. else
  131. {
  132. counterBuilder.Append("0");
  133. }
  134. counterBuilder.Append(",");
  135. if (counter.GetEncryptNickNum() != 0)
  136. {
  137. counterBuilder.Append(counter.GetEncryptNickNum());
  138. }
  139. else
  140. {
  141. counterBuilder.Append("0");
  142. }
  143. counterBuilder.Append(",");
  144. if (counter.GetEncryptReceiverNameNum() != 0)
  145. {
  146. counterBuilder.Append(counter.GetEncryptReceiverNameNum());
  147. }
  148. else
  149. {
  150. counterBuilder.Append("0");
  151. }
  152. counterBuilder.Append(",");
  153. if (counter.GetEncryptSimpleNum() != 0)
  154. {
  155. counterBuilder.Append(counter.GetEncryptSimpleNum());
  156. }
  157. else
  158. {
  159. counterBuilder.Append("0");
  160. }
  161. counterBuilder.Append(",");
  162. if (counter.GetEncryptSearchNum() != 0)
  163. {
  164. counterBuilder.Append(counter.GetEncryptSearchNum());
  165. }
  166. else
  167. {
  168. counterBuilder.Append("0");
  169. }
  170. // decrypt
  171. counterBuilder.Append(",");
  172. if (counter.GetDecryptPhoneNum() != 0)
  173. {
  174. counterBuilder.Append(counter.GetDecryptPhoneNum());
  175. }
  176. else
  177. {
  178. counterBuilder.Append("0");
  179. }
  180. counterBuilder.Append(",");
  181. if (counter.GetDecryptNickNum() != 0)
  182. {
  183. counterBuilder.Append(counter.GetDecryptNickNum());
  184. }
  185. else
  186. {
  187. counterBuilder.Append("0");
  188. }
  189. counterBuilder.Append(",");
  190. if (counter.GetDecryptReceiverNameNum() != 0)
  191. {
  192. counterBuilder.Append(counter.GetDecryptReceiverNameNum());
  193. }
  194. else
  195. {
  196. counterBuilder.Append("0");
  197. }
  198. counterBuilder.Append(",");
  199. if (counter.GetDecryptSimpleNum() != 0)
  200. {
  201. counterBuilder.Append(counter.GetDecryptSimpleNum());
  202. }
  203. else
  204. {
  205. counterBuilder.Append("0");
  206. }
  207. counterBuilder.Append(",");
  208. if (counter.GetDecryptSearchNum() != 0)
  209. {
  210. counterBuilder.Append(counter.GetDecryptSearchNum());
  211. }
  212. else
  213. {
  214. counterBuilder.Append("0");
  215. }
  216. // search
  217. counterBuilder.Append(",");
  218. if (counter.GetSearchPhoneNum() != 0)
  219. {
  220. counterBuilder.Append(counter.GetSearchPhoneNum());
  221. }
  222. else
  223. {
  224. counterBuilder.Append("0");
  225. }
  226. counterBuilder.Append(",");
  227. if (counter.GetSearchNickNum() != 0)
  228. {
  229. counterBuilder.Append(counter.GetSearchNickNum());
  230. }
  231. else
  232. {
  233. counterBuilder.Append("0");
  234. }
  235. counterBuilder.Append(",");
  236. if (counter.GetSearchReceiverNameNum() != 0)
  237. {
  238. counterBuilder.Append(counter.GetSearchReceiverNameNum());
  239. }
  240. else
  241. {
  242. counterBuilder.Append("0");
  243. }
  244. counterBuilder.Append(",");
  245. if (counter.GetSearchSimpleNum() != 0)
  246. {
  247. counterBuilder.Append(counter.GetSearchSimpleNum());
  248. }
  249. else
  250. {
  251. counterBuilder.Append("0");
  252. }
  253. counterBuilder.Append(",");
  254. if (counter.GetSearchSearchNum() != 0)
  255. {
  256. counterBuilder.Append(counter.GetSearchSearchNum());
  257. }
  258. else
  259. {
  260. counterBuilder.Append("0");
  261. }
  262. }
  263. }
  264. }