//화면 종료시에 등록 해제 public void UnregDataAgent(object objToUnreg) { int key = objToUnreg.GetHashCode(); if (mapDataAgent.ContainsKey(key)) { mapDataAgent.Remove(key); Debug.WriteLine("DataAgent 등록해제", category); } //20130107 DataAgent 해제시 세션에서 사용중이면 해당세션 재접속 if (_bShutDownProc == false) { List <RtfSession> dst_listSession = listSessionL; for (int i = 0; i < dst_listSession.Count; i++) { RtfSession session = dst_listSession[i]; TRItem tritem = session.GetAttachedTRItem(); if (tritem != null) { if (tritem.nDataAgentHash == key) { //20130130 조회중 화면 종료시 세션재접속 session.ReconnectToServerByScreenClose(); } } } } }
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(); } }
public void RequestNextDataManual(object objDataAgent) { List <RtfSession> dst_listSession = listSessionL; //현재 사용가능한 세션이 있는지 검색 for (int i = 0; i < dst_listSession.Count; i++) { RtfSession session = dst_listSession[i]; TRItem tritem = session.GetAttachedTRItem(); if (tritem != null) { if (tritem.nDataAgentHash == objDataAgent.GetHashCode()) { session.SendToServerNextData(); } } } }
//20130725 [4] 대상 DataAgent를 처리중인 세션을 찾는다. public void RequestNextDataManualEx(int SvrNo, object objDataAgent, byte[] ByteSndData) { List <RtfSession> dst_listSession = listSessionL; //현재 사용가능한 세션이 있는지 검색 for (int i = 0; i < dst_listSession.Count; i++) { RtfSession session = dst_listSession[i]; TRItem tritem = session.GetAttachedTRItem(); if (tritem != null) { //세션을 찾음 if (tritem.nDataAgentHash == objDataAgent.GetHashCode()) { session.SendToServerNextDataEx(SvrNo, ByteSndData); } } } }
public void RequestExitDataManual(object objDataAgent) { List <RtfSession> dst_listSession = listSessionL; //현재 사용가능한 세션이 있는지 검색 for (int i = 0; i < dst_listSession.Count; i++) { RtfSession session = dst_listSession[i]; TRItem tritem = session.GetAttachedTRItem(); if (tritem != null) { if (tritem.nDataAgentHash == objDataAgent.GetHashCode()) { //수신 대기인 상태 if (session.state == RtfSessionState.recieved) { session.SendToServerServiceExitTR(); } } } } }
public void reConnectAllSession(bool bTry) { int i = 0; for (i = 0; i < listSessionL.Count; i++) { listSessionL[i].ShutDownSession(); } SessionPush.ShutDownSession(); if (bTry) { for (i = 0; i < listSessionL.Count; i++) { RtfSession session = listSessionL[i]; session.ReconnectToServerBySessionDisconnected(); } //ConnectInfo connectInfo = RtfGlobal.Instance.GetConnectInfo(); // ConnectPushServer(connectInfo._PushServerIP, connectInfo._PushServerPORT); //"10.1.121.112", "7700" } // m_pollingTag = 0; }
public RtfSessionManager() { //저용량용 세션 N개 생성 int nSessionCountSmall = 0; for (int i = 0; i < nSessionCountSmall; i++) { listSessionS.Add(new RtfSession(this, RtfSessionType.small, "저용량세션" + i.ToString())); } //대용량용 세션 N개 생성 int nSessionCountLarge = Math.Max(1, SESSION_COUNT); for (int i = 0; i < nSessionCountLarge; i++) { listSessionL.Add(new RtfSession(this, RtfSessionType.large, "대용량세션" + i.ToString())); } //푸쉬 세션 SessionPush = new RtfSession(this, RtfSessionType.push, "실시간세션"); SessionPush.m_async_socket.OnPushData += new RtfAsyncSocket.RtfAsyncSocket_OnPushDataEventHandler(SessionPush_OnPushData); //SessionLogin = new RtfSession(this, RtfSessionType.login, "로그인세션"); }
//대기큐에서 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); } } }
//메인 접속 성공 public void OnMainFrameConnect(RtfSession session, SessionManagerEvent smng_event) { if (session.IsPushSession()) { //푸쉬 접속시... if (smng_event == SessionManagerEvent.push_connected) { //메인 프레임에 접속 성공 이벤트를 알린다 ThreadSafe_OnSessionManagerEvent(this, new SessionManagerEventArgs(SessionManagerEvent.push_connected)); } } else { //로그인시 최초 접속 성공전일때... if (bLoginFinished == false) { if (smng_event == SessionManagerEvent.connected) { //최초로 접속이 성공한 순간.. bLoginFinished = true; //각 세션들을 접속 ConnectSessionsToServer(strIP, strPort); //폴링 타이머 시작 PollingTimerStart(); } if (smng_event == SessionManagerEvent.connected || smng_event == SessionManagerEvent.connect_failure) { //세션메니저의 이벤트를 메인에 통보한다. //최초 접속성공시 // 로그인시 접속성공/실패/등등... ThreadSafe_OnSessionManagerEvent(this, new SessionManagerEventArgs(smng_event)); } } else { //로그인후... 접속종료시... if (smng_event == SessionManagerEvent.disconnected) { //전체 세션 접속 종료시... bool bNotifyAllDisconnected = true; for (int i = 0; i < listSessionL.Count; i++) { RtfSession cur_session = listSessionL[i]; if (cur_session.bConnected == true) { bNotifyAllDisconnected = false; break; } } if (bNotifyAllDisconnected) { ThreadSafe_OnSessionManagerEvent(this, new SessionManagerEventArgs(smng_event)); } } } //20130130 접속이벤트 발생시 현재 대기중인 TRITEM처리 if (this._bShutDownProc == false) { //if (smng_event == SessionManagerEvent.connected || smng_event == SessionManagerEvent.connect_failure) if (smng_event == SessionManagerEvent.connected) { // 2013/10/22 세션 자동접속을 수동접속으로 변경 m_pollingTag = 0; // 폴링 카운트를 초기화 //대기큐에서 유효한 TRItem을 세션에 할당 DequeueReadyQueue(true); } } } }