// 增加一个完成的api订单 public void addApiOrder(OrderInfo info, string devKey) { if (info == null) { return; } if (string.IsNullOrEmpty(info.m_apiCallback)) // 没有回调地址 { return; } ApiCallOrderInfo copyInfo = copyApiOrder(info); copyInfo.m_apiDevKey = devKey; if (m_taskQue.Count > MAX_TASK) { // 达到了最大值,此时将信息写入db,供空闲时处理 saveInfo(copyInfo); m_isReadDb = true; } else { lock (m_lockObj) { m_taskQue.Enqueue(copyInfo); } } }
string constructURL(ApiCallOrderInfo info) { int result = 0; if (info.m_orderState != PlayerReqOrderState.STATE_FINISH) { result = info.m_failReason; } string sign = Tool.getMD5Hash(info.m_orderId + info.m_apiOrderId + info.m_playerAcc + info.m_money + info.m_orderType + result + info.m_apiDevKey); string str = string.Format(CALL_URL_PARAM, info.m_orderId, info.m_apiOrderId, info.m_playerAcc, info.m_money, info.m_orderType, result, sign); int index = info.m_apiCallback.IndexOf('?'); if (index >= 0) // 回调本身携带了参数 { return(info.m_apiCallback + "&" + str); } return(info.m_apiCallback + "?" + str); }
// 回调api页面。返回true调用成功 private bool call(ApiCallOrderInfo info) { if (info.m_tryCount >= TRY_MAX_COUNT) // 已重试过指定次数,都没有成功,不再调用 { return(true); } TimeSpan span = DateTime.Now - info.m_lastProcessTime; if (span.TotalSeconds > CALL_INTERVAL) { string url = constructURL(info); var ret = HttpPost.Get(new Uri(url)); if (ret != null) { string retStr = Encoding.UTF8.GetString(ret); if (retStr == "ok") { return(true); } } info.m_tryCount++; info.m_lastProcessTime = DateTime.Now; } return(false); }
private void saveInfo(ApiCallOrderInfo info) { bool exist = MongodbPlayer.Instance.KeyExistsBykey(TableName.API_ORDER_CALL, "key", info.m_key); if (exist) // 这条记录已存在了 { return; } Dictionary <string, object> data = new Dictionary <string, object>(); data.Add("key", info.m_key); data.Add("orderId", info.m_orderId); data.Add("playerAcc", info.m_playerAcc); data.Add("money", info.m_money); data.Add("orderType", info.m_orderType); data.Add("orderState", info.m_orderState); data.Add("failReason", info.m_failReason); data.Add("apiOrderId", info.m_apiOrderId); data.Add("apiCallback", info.m_apiCallback); data.Add("tryCount", info.m_tryCount); data.Add("lastProcessTime", info.m_lastProcessTime); data.Add("devKey", info.m_apiDevKey); MongodbPlayer.Instance.ExecuteInsert(TableName.API_ORDER_CALL, data); }
// 从数据库读取数据 private void readInfo() { if (m_taskQue.Count > 0) { return; } if (!m_isReadDb) { return; } try { List <Dictionary <string, object> > dataList = MongodbPlayer.Instance.ExecuteGetListByQuery(TableName.API_ORDER_CALL, null, null, "", true, 0, MAX_TASK); if (dataList.Count == 0) { m_isReadDb = false; } for (int i = 0; i < dataList.Count && m_run; i++) { Dictionary <string, object> data = dataList[i]; ApiCallOrderInfo copyInfo = new ApiCallOrderInfo(); copyInfo.m_key = Convert.ToString(data["key"]); copyInfo.m_apiCallback = Convert.ToString(data["apiCallback"]); copyInfo.m_orderId = Convert.ToString(data["orderId"]); copyInfo.m_apiOrderId = Convert.ToString(data["apiOrderId"]); copyInfo.m_money = Convert.ToInt64(data["money"]); copyInfo.m_playerAcc = Convert.ToString(data["playerAcc"]); copyInfo.m_orderType = Convert.ToInt32(data["orderType"]); copyInfo.m_orderState = Convert.ToInt32(data["orderState"]); copyInfo.m_failReason = Convert.ToInt32(data["failReason"]); if (data.ContainsKey("devKey")) { copyInfo.m_apiDevKey = Convert.ToString(data["devKey"]); } lock (m_lockObj) { m_taskQue.Enqueue(copyInfo); } } } catch (System.Exception ex) { LogMgr.log.Error(ex.ToString()); } }
private void run() { ApiCallOrderInfo data = null; while (m_run) { while (m_taskQue.Count > 0) { if (!m_run) { break; } lock (m_lockObj) { data = m_taskQue.Dequeue(); } if (data != null) { bool res = call(data); if (res) // 完成 { MongodbPlayer.Instance.ExecuteRemoveBykey(TableName.API_ORDER_CALL, "key", data.m_key); } else { lock (m_lockObj) { // 没有处理成功,重新加入队列 m_taskQue.Enqueue(data); } } } } if (m_run) { readInfo(); } if (m_taskQue.Count == 0 && m_run) { Thread.Sleep(5000); } } }
// 拷贝api调用所需信息 private ApiCallOrderInfo copyApiOrder(OrderInfo info) { ApiCallOrderInfo copyInfo = new ApiCallOrderInfo(); copyInfo.m_key = info.m_key; copyInfo.m_apiCallback = info.m_apiCallback; copyInfo.m_orderId = info.m_orderId; copyInfo.m_apiOrderId = info.m_apiOrderId; copyInfo.m_money = info.m_money; copyInfo.m_playerAcc = info.m_playerAcc; copyInfo.m_orderType = info.m_orderType; copyInfo.m_orderState = info.m_orderState; copyInfo.m_failReason = info.m_failReason; copyInfo.m_tryCount = 0; copyInfo.m_lastProcessTime = DateTime.MinValue; return(copyInfo); }