Пример #1
0
        //화면 종료시에 등록 해제
        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();
                        }
                    }
                }
            }
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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();
                    }
                }
            }
        }
Пример #4
0
        //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);
                    }
                }
            }
        }
Пример #5
0
        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();
                        }
                    }
                }
            }
        }
Пример #6
0
        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;
        }
Пример #7
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, "로그인세션");
        }
Пример #8
0
        //대기큐에서 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);
                }
            }
        }
Пример #9
0
        //메인 접속 성공
        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);
                    }
                }
            }
        }