void SessionManager_OnTimer(object state) { if (_bShutDownProc == false) { //폴링 체크시 디큐를 막는다. PollingTimerStop(); lock (lockDequeue) { // 2013/10/22 세션 자동접속을 수동접속으로 변경 m_pollingTag++; // Debug.WriteLine(string.Format("폴링카운트 : {0}", m_pollingTag.ToString())); // 폴링 데이타가 내려오지 않는것으로 보아 문제가 있는것으로 체크 // 2번 polling 했는데 응답이 없으면 끊어버리고 재연결 메시지 뛰움 if (m_pollingTag > 2) { // 메인프레임으로 알림 // 메인프레임에서 판단(재연결할지, 취소할지) ThreadSafe_OnSessionManagerEvent(this, new SessionManagerEventArgs(SessionManagerEvent.reconnectyn)); return; } //각 세션들의 폴링 상태를 체크한다. for (int i = 0; i < listSessionL.Count; i++) { RtfSession session = listSessionL[i]; //20130130 세션 접속이 끊어진 경우 재접속한다. if (session.bConnected == false) { // session.ReconnectToServerBySessionDisconnected(); } else { //폴링 TR을 전송할지 여부를 체크한다. // if (session.CheckRequestPolling() == true) // { // 2013/12/30 세션이 할당 가능한지 체크를 해주자..... // 대용량 data 연속 조회시 유효성 확보 91101 침범가능 // 연속조회 중간에 서버에 서비스 종료 TR을 전송 문제 발생 (SendToServerServiceExitTR) if (session.IsSessionReady()) { byte[] buffData = null; TRItem tritem_polling = new TRItem(1, "91101", 0, 1, 0, "", buffData, 0); session.AttachTRItem(tritem_polling); } // } } } } // m_pollingTag++; PollingTimerStart(); //폴링 타이머 재가동 // PollingTimerUpdate(); } }
//대기큐에서 TRItem을 하나씩 얻어와서 처리한다. public void DequeueReadyQueue(bool bLarge) { //20130130 셧다운 상태면 더이상 처리하지 않는다. if (_bShutDownProc) { return; } //쓰레드 사용시 DequeueReadyQueue 블럭이 동시에 실행되므로 주의.. //work_session에 이미 TRItem 할당중인 세션이 다시 할당되는 문제 발생.. //크리티컬 섹션으로 블럭킹해서 처리. lock (lockDequeue) { Queue <TRItem> dst_queue = (bLarge) ? readyQueueL : readyQueueS; List <RtfSession> dst_listSession = (bLarge) ? listSessionL : listSessionS; //대기큐가 비어있다면 종료 if (dst_queue.Count < 1) { return; } //현재 사용가능한 세션이 있는지 검색 RtfSession work_session = null; for (int i = 0; i < dst_listSession.Count; i++) { RtfSession session = dst_listSession[i]; //현재 세션이 사용 가능한 상태면 if (session.IsSessionReady()) { //스레드 오류 방지 : 가능상태가 되자마자 불가능 상태로 만들어 버리는 방법( 크리티컬세션 미사용시 오류 최소화 ) work_session = session; break; } //20130130 세션이 접속이 끊어진 상태면 재접속 <자동재접속 사용안함> /* * if (_bShutDownProc == false) * { * if (session.bConnected == false) * { * session.ReconnectToServerBySessionDisconnected(); * } * } */ } //사용가능한 세션이 없으면 종료 if (work_session == null) { return; } //사용가능한 세션이 있다면 ... //큐에서 tritem을 dequeue TRItem tritem_attach = null; while (dst_queue.Count > 0 && tritem_attach == null) { //일단 맨앞에꺼 하나를 꺼내온다. TRItem tritem = dst_queue.Dequeue(); string log = string.Format("***** {0} 대기큐에서 삭제.. 대기큐 사이즈={1} TRItem nSeq={2} 상태={3}", bLarge ? "Large" : "Small", dst_queue.Count, tritem.nSeq, tritem.status); Debug.WriteLine(log); //TRItem의 대상 DataAgent의 유효성을 체크 if (IsValidDataAgent(tritem.nDataAgentHash)) { //현재 대기 상태인 TR아이템만 세션에 할당한다. if (tritem.status == TRItemStatus.ready) { tritem_attach = tritem; break; } } //세션 할당에 실패한 경우 TRItem을 관리 맵에서 삭제 RemoveTRItem(tritem.nSeq); } //세션에 tritem을 등록 if (tritem_attach != null) { work_session.AttachTRItem(tritem_attach); } } }