Window service를 두어번 개발한 경험이 있는데...
이 녀석이 구조적으로는 매우 단순함에도 불구하고 그 특성상 항상 개발이 쉽지 않았습니다.
이번에는 Window service에서 Message queue (이하 MSMQ)를 monitoring 하는 기능을 개발하게 되었습니다.
그간의 경험을 바탕으로 Window service는 최소한의 code로 동작을 시키도록 작성하였습니다.
버뜨 그러나!!
시작과 동시에 죽어버리는 service...
다시는 이런 일을 겪지 않으리라 다짐하면서...
간단하게 window service에 대한 개발 방법을 정리하고, MSMQ 접근에 대한 issue 처리를 살펴 보겠습니다.
Window Service 개발
Window service를 등록하여 실행할 때, 제대로 동작하는 지 여부를 검사합니다.
따라서 OnStart() 메서드에는 무거운 작업을 담지 않도록 하는 게 중요하며
Infinity loop 작업은 별도의 Thread를 돌려서 동작하도록 해 주는 게 일반적인 pattern으로 보입니다.
또한 service가 도는 중의 문제를 정확히 파악하기 위해서 EventLog를 적절히 사용하는 게 중요합니다.
Operation 과정에서 문제가 발생할 때 이를 추적하는 가장 손쉬운 방법 중 하나입니다.
간단하게는 Exception이 발생했을 때 아래의 LogEvent()를 호출함으로써 그 내용을 남겨서 원인을 분석할 수 있게 합니다.
EventViewer는 실행창에서 'eventvwr'를 입력하고 실행하면 빠른 접근이 가능합니다.
위는 EventViewer 화면예제입니다.
Event Viewer > Windows Logs > Application or System 에서 Event 확인이 가능합니다.
DB operation 간 NullReference 가 발생한 것을 확인할 수 있습니다. :)
Access to MSMQ from Window service
Window service는 보통 Local System권한으로 실행합니다.
MSMQ에 접근하기 위해서는 System으로 접근 할 수 있도록 permission setting을 해줘야합니다.
대상 private queue를 찾아 properties > Security tab > Add user (SYSTEM 등록) > Full Control 처리합니다.
References
http://stackoverflow.com/questions/4864673/windows-service-to-run-constantly
http://stackoverflow.com/questions/3731627/win-service-getting-permission-denied-to-message-queuing
'Programming > Etc' 카테고리의 다른 글
TechDays2015Korea 후기 .NET 2015 (0) | 2015.10.28 |
---|---|
Mobile Enterprise summit 2015 후기 (0) | 2015.05.14 |
log4net (0) | 2015.01.05 |
Tech days 2014 Korea 후기. (0) | 2014.09.25 |
tech.days 2014 참석 예정 (0) | 2014.09.16 |