Пример #1
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();
            }
        }
Пример #2
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);
                }
            }
        }