본문 바로가기

.net

Windows Service Programming With C# [2]


3. 이제 본격적으로 Service 로직을 구현해보겠습니다.
System.ServiceProcess.ServiceBase를 상속받는 Service.cs를 생성합니다.

/*기본으로 제공되는 소스는 이 강좌에서 삭제되었습니다.*/

Service.cs

//클래스 변수 선언
Thread m_heartbeatThread_Remote = null;
bool m_threadAlive = true;

/// <summary>
/// 이 서비스를 시작합니다. 스레드 시작
/// </summary>
protected override void OnStart(string[] args)
{
    m_threadAlive = true;
    m_heartbeatThread_Remote = new Thread(new ThreadStart(startMonitorRemote));
    m_heartbeatThread_Remote.Start();
}
 
/// <summary>
/// 이 서비스를 중지합니다. 스레드 중지
/// </summary>
protected override void OnStop()
{
    m_threadAlive = false;
    m_heartbeatThread_Remote.Suspend();
}

/// <summary>
/// Config.ini파일을 읽기 위한 Method입니다.
/// </summary>
private void readConfig()
{
    //IniFile Class 객체생성
    IniFile ini = new IniFile( @"C:\serviceProject\Config.ini");
    PropertyClass.Url                      = ini.IniReadValue("Info","url");
    PropertyClass.HeartBeat_interval = ini.IniReadValue("Info","heartbeat");
    PropertyClass.TimeOut_interval  = ini.IniReadValue("Info","timeout");
}

/// <summary>
/// 호출될 웹 어플리케이션 URL에서 텍스트 문자열을 읽어드립니다.
/// 여기서는 정상적일때는 "OK"문자열을 읽어드려 true를 리턴하게 처리했습니다.
/// </summary>
private bool checkResponseContent(WebResponse webResponse)
{
    Stream responseStream = webResponse.GetResponseStream();
    StreamReader responseReader = new StreamReader(responseStream);
    string responseString = responseReader.ReadToEnd();
    if(responseString.Equals("OK"))
        return true;
    else
        return false;
  }

/// <summary>
/// 스레드로 인하여 주기적으로 호출될 Method입니다.
/// </summary>
private void startMonitorRemote()
{
    //먼저 Config.ini을 읽어드립니다.
    readConfig();

    bool sendFlag = true;
    bool error = false;
    WebResponse myHttpWebResponse = null;
    //m_threadAlive 변수가 true일때만 호출됩니다.
    while(m_threadAlive)
    { 
        try
        {
            try
            {
                //지정된 URL을 호출하기 위하여 HttpWebRequest 객체 생성
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(PropertyClass.Url1);
                myHttpWebRequest.KeepAlive = false;
                //설정된 TimeOut Interval을 지정합니다. 초단위 변경으로 인하여 * 1000
                myHttpWebRequest.Timeout=int.Parse(PropertyClass.TimeOut_interval) * 1000;
                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                //생성된 HttpWebRequest 객체를 checkResponseContent Method호출로 해당 페이지의 Text를 읽어 드립니다.
                if(!checkResponseContent(myHttpWebResponse))
                    error = true;   //장애발생으로 판단
                else 
                    error = false;
            }
            catch
            {
                error = true;  //장애발생으로 판단
            }
            finally
            {
                try
                {
                    if(error)
                    {
                        /**
                        * sendFlag의 역활은 장애발생시 호출될 doAction Method에서 SMS, E-Mail를
                        * 발 송하게 된다고 가정을 하면 장애가 한번 발생하게 되면 장애가 복구되지 않는
                        * 한 계속 호출이 됩니다. 이를 방지하기 위함입니다.
                        */

                        if(sendFlag)
                            doAction(); //이 Method는 직접 구현해주시면 됩니다.
                        sendFlag = false;
                    }
                    else
                    {
                        sendFlag = true;
                        error = false;
                    }
                    myHttpWebResponse.Close();
                }
                catch(Exception ex1)
                {
                    /*에러로그를 남겨주세요.*/
                }
            }
        }
        catch(Exception ex2)
        {
             /*에러로그를 남겨주세요.*/
         }
         finally
        {
             //지정된 HeartBeat Interval마다 Thread Sleep합니다. 
            Thread.Sleep(int.Parse(PropertyClass.HeartBeat_interval) * 1000);
        }       
    }
}

여기까지가 Service Class구현부입니다.

그럼 이제 컴파일하시면 Service.exe가 생성되겠죠?

그럼 어떻게 Service.exe를 윈도우 서비스에 동록을 해야 될까요?

그 답은 아래와 같이 간단합니다.

등록     => C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\installUtil    Service.exe
등록해제 => C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\installUtil /u Service.exe

위 소스는 사실 많이 부족한 면이 있습니다만 이 소스를 가지고 뼈와 살을 좀 붙이시면 좀 더 멋진 서버모니터링이 가능한 윈도우 서비스가 될 것 같습니다.

여기까지 읽어 주셔서 감사합니다.

'.net' 카테고리의 다른 글

Microsoft IT Trend 2011  (0) 2011.02.21
Windows Service Programming With C# [1]  (4) 2011.01.20
Ping Class  (2) 2009.01.23