2009-07-15 3 views
1

장기 실행 프로세스를 수행하는 Windows 서비스가 있습니다. 타이머에 의해 트리거되며 전체 프로세스를 완료하는 데 몇 분이 걸릴 수 있습니다. 타이머가 경과하면 서비스는 다양한 작업을 수행하는 관리 개체를 인스턴스화하고 결과를 기록한 다음 종료합니다.Windows 서비스에서 장기 실행 프로세스 종료

프로세스가 진행되는 동안 서버가 종료되는 경우를 처리하기 위해 구현 한 것이 없습니다. 몇 가지 문제가 발생할 수 있습니다. 이것을 처리하는 가장 좋은 방법은 무엇입니까?

답변

0

실제로 어떤 작업을 수행하고 있는지 모르기 때문에 모호한 제안 만 할 수 있습니다.

데이터베이스와 관련하여 커밋되지 않은 경우 롤백 할 수있는 트랜잭션이 있습니다.

파일 조작과 관련이있는 경우 트랜잭션 NTFS의 this 문서를 살펴보십시오. TransactionScope 객체와 함께 사용하여 원자 트랜잭션을 보장 할 수 있습니다.

웹 서비스를 다루는 경우 하나의 트랜잭션이 시작/끝나고 다른 트랜잭션이 시작될 때 서비스 경계가 지정됩니다. 보상 모델을 사용하십시오 (파트에서 어떤 것을 깨뜨린 경우 나중에 방법을 제공해야 함). 복구 후 보상 스크립트를 상대방에게 알리거나 실행하는 방법 (온라인 주문 및 backorder 처리, 취소 등)에 대해 생각하십시오.

추적 메커니즘의 경우 모든 단계와 타임 라인을 기록하십시오. 셧다운이 발생하면 문제 해결

0

본질적으로 배치 프로세스를 설명하면 일정한 간격으로 작동하는 타이머가 있어야합니다. d 그런 식으로 작동합니다.

장기간 지속되면 작업 단위 또는 배치를 작게 유지하여 프로세스가 적어도 신호가 중지되었는지 여부를 확인할 수 있도록하십시오. 그러면 서비스 중지 메시지를 본질적으로 무시하는 대신 서비스가 정상적으로 종료됩니다.

어딘가에 IsShutdownRequired 또는 IsShutdownRequired 속성이 있습니다. 타이머 기능에서 일부 루프 처리를 가정하여 검사합니다. 서비스 중지 제어 메시지에서이 속성을 true로 설정하면 더 많은 작업을하지 않거나 Jimmy가 제안한대로 트랜잭션이 정상적으로 종료 될 때 프로세스를 정상적으로 종료 할 수 있습니다.

이상적으로 작은 배치는 하나의 큰 배치보다 좋을 것입니다.