public void HandleCallBackData() { Queue<String> postponeData = new Queue<string>(); while (true) { String rawData = ""; lock (_callBackData) { if (_callBackData.Count > 0) { rawData = _callBackData.Dequeue(); } else { break; } } PowerBaseResultData resultData = new PowerBaseResultData(rawData, this.PT, IsReal()); if (!this._account.ContractPacketCallBackFromPB(resultData)) { postponeData.Enqueue(rawData); } } if (postponeData.Count > 0) { // 외부에서 주문을 내는 경우 당연히 생긴다. // 계속 시도는 해보고 대신 에러 상황이라고 단정 내리지는 말자 lock (_callBackData) { while (_callBackData.Count > 0) { postponeData.Enqueue(_callBackData.Dequeue()); } _callBackData = postponeData; } } }
public Boolean ContractPacketCallBackFromPB(PowerBaseResultData resultData) { UpdateOrderIn(); 주문처리유형_플래그 ott = GetOrderResult(resultData.주문처리유형); String orderActionType = resultData.호가구분; if (resultData.정상_정정_취소 == 2 && ott == 주문처리유형_플래그.확인) // 취소된 것이 확인되었다. { // 취소되었고 완료 되었다. // 원주문번호에게 주문이 취소되었다고 알려주도록 한다. long originNumber = resultData.원주문번호; long totalCancelCount = resultData.원주문정정취소수량; if (_inProgressOrders.ContainsKey(originNumber)) { POrder po = _inProgressOrders[originNumber]; po.UpdateCancelMessage(resultData.원주문정정취소수량); if (!po.IsDone()) { logger.Error("Does not finish after cancel packet"); Util.KillWithNotice("Does not finish after cancel packet"); return true; } else { logger.Debug("Cancel complete. #({0})", resultData.원주문번호); CompleteOrdering(po); } } else { logger.Warn("Cancel packet is received after price order gone"); return true; } } else if (resultData.정상_정정_취소 == 0 && ott == 주문처리유형_플래그.일부체결) // 일부 체결 { if (_completeOrders.ContainsKey(resultData.주문번호)) { // 할일이 없다. return true; } if (_inProgressOrders.ContainsKey(resultData.주문번호)) { POrder o = _inProgressOrders[resultData.주문번호]; o.Update(resultData.전체체결수량, resultData.평균단가, false); ReturnBackContractCallBack(o); logger.Debug("Contract. #({0}), {1:n0}", resultData.주문번호, resultData.전체체결수량); } else { // _completeOrders, _inProgressOrders 모두 안 들어있다. 유보한다. return false; } } else if (resultData.정상_정정_취소 == 0 && ott == 주문처리유형_플래그.전량체결) // 전량 체결 { if (_completeOrders.ContainsKey(resultData.주문번호)) { // 할일이 없다. return true; } if (_inProgressOrders.ContainsKey(resultData.주문번호)) { POrder o = _inProgressOrders[resultData.주문번호]; o.Update(resultData.전체체결수량, resultData.평균단가, true); CompleteOrdering(o); logger.Debug("Contract complete. #({0}), {1:n0}", resultData.주문번호, resultData.전체체결수량); } else { // _completeOrders, _inProgressOrders 모두 안 들어있다. 유보한다. return false; } } return true; }