2016. 4. 12. 15:00

데몬은 보통 애플리케이션으로 만듭니다.

윈도우에서는 '서비스'로 만들고

유닉스 계열에서는 '데몬'을 시스템에 등록하여 사용합니다.

이외에는 일반 어플리케이션처럼 UI를 넣어서 만들기도 하지만 보통은 콘솔로도 만들기도 하죠.

 

그런데 이런 데몬은 항상 운영체제에 상주해야 합니다.

문제는 웹서버와 일반서버의 가격은 엄청나게 차이가 난다는 것이죠.

 

그래서 웹서버에서 돌려도 되는 데몬이라면 웹서버에서 구현하는 것이 좋을까 해서 검색해보니...

'Application_Start'를 이용해 보시죠.

 

오홋!

asp.net는 프로그램이 웹서버가 시작되면 'Global.asax'의 'Application_Start'가 메인처럼 동작합니다.

(참고 : [ASP.Net] ASP.Net의 Main은 어디 있을까? (Global.asax파일), [Asp.Net] global.asax 이벤트 )

 

그렇다는 것은 'Application_Start'에서 데몬을 시작 시 웹서버에서 데몬이 돌아가는 모양이 됩니다.

 

여기서 주의할 점은 asp.net의 생명주기뿐입니다.

웹서버와 함께 올라가고 웹서버와 함께 떨어지겠죠.

(설정이나 게시 시점에 따라서 웹서버에 최초접속자가 생겨야 올라갈 수도 있습니다.)

 

 

1. 테스트용 데몬 만들기

일단 웹 프로젝트를 생성하고 데몬용 클래스를 만들어 봅시다.

 

이 데몬은 자신의 루트에 계속 텍스트파일을 생성합니다.

namespace WebDaemon
{
	public class CWebDaemon
	{

		public bool Running = true;

		private int m_nCount = 0;

		/// <summary>
		/// 파일 생성 위치
		/// </summary>
		private string m_sDir = "";

		public CWebDaemon(string sDir)
		{
			this.m_sDir = sDir;
		}

		public void Start()
		{
			ThreadPool.QueueUserWorkItem(ConvertThread);
		}

		public void ConvertThread(object threadContext)
		{
			//일시 정지 여부
			bool bSleep = true;

			while (true == this.Running)
			{
				++m_nCount;

				File.Create(this.m_sDir + m_nCount + ".txt").Close();

				if (true == bSleep)
				{
					//지정된 시간만큼 쉬고
					Thread.Sleep(3000);
				}

				//다음 루프를 위한 초기화
				bSleep = true;
			}
		}//end ConvertThread

	}
}

 

 

2. 'Global.asax'구성하기

데몬은 웹 애플리케이션이 시작되면 같이 시작되어야 하므로 'Application_Start'에서 데몬을 시작하면 됩니다.

protected void Application_Start(object sender, EventArgs e)
{
	webDaemon = new CWebDaemon(HttpContext.Current.Server.MapPath("~/") + @"\");
	webDaemon.Start();
}

 

 

3. 테스트

이제 웹 애플리케이션이 올라가면 데몬이 동작합니다.

파일을 잘 생성하고 있습니다.

 

마무리

여기서 한가지 조심해야 할것이....

웹 서버업체별로 약관도 다르고, 허용해 둔 것도 달라서 상황에 따라서 짤릴 수도 있습니다-_-;;;

비싼 거 쓰시는 분들이야 문제없겠지만 말이죠 ㅎㅎㅎ

 

그리고 웹서버 생명주기에 따라 데몬이 죽습니다.

예외 처리를 하거나 웹서버가 죽지 않게 설정하거나 제3의 방법을 쓰는 식의 꼼수를 사용해야 합니다ㅎㅎㅎ

(참고 : [IIS] 웹 응용프로그램은 영원하지 않다. )

 

테스트용 프로젝트입니다.

WebDaemon.zip
다운로드