2009-08-28 2 views
1

현재 작업에서는 일부 작업에 대해 OrderId와 같은 관련 정보가 포함 된 COMPLETED-Order, STARTED-Request, REJECTED-Order와 같은 메시지를 데이터베이스에 보냅니다. 모든 메시지 명령 패턴을 구현하는 Command 클래스에 해당합니다.ThreadPool 다른 작업 완료에 따라 달라지는 작업

interface ICommand 
{ 
    void Execute(); 
} 

public class RequestStartedCommand:ICommand 
{ 
    public void Execute() 
    { 
    //do the related work..... 
    } 
} 

//other commands... 

Windows 서비스는이 메시지를 소비 한 다음 명령 위에서 변환하고 ThreadPool에서 명령을 실행합니다.

그러나 OrderID = 23의 COMPLETED-Order 명령과 같은 다른 명령을 실행해야하는 명령 중 일부는 동일한 주문의 REJECTED-Order 명령보다 먼저 실행해야합니다. 어떻게해야합니까? 또는 어떤 전략을 따라야합니까? 모든 예제 또는 문서가 유용 할 것입니다.

답변

1

일부 종속성 검사를 구현하려고합니다. 명령을 거부 한 것과 같은 명령은 실행되기 전에 유효한 상태인지 확인해야합니다. 관리자/서비스 관리자는 목록에서 명령을 실행하고 해당 유효성 검사를 적용한 다음 유효성 검사가 완료되지 않은 경우 목록으로 되돌립니다.

기아를 조심하거나 목록에 영원히 머물러 있어야하는 명령에주의하십시오.

0

Ami Bar가 작성한 Smart Thread Pool을 사용했습니다. 몇 년 동안 생산되어 왔고 당시 .NET 1.1의 구현이 부족했기 때문에 선택되었습니다.

STP는 그룹의 동시 스레드 수를 1로 설정하면 관련 작업 항목을 대기열에 넣을 수있는 작업 그룹 그룹을 구현합니다. 50-100 온라인 클라이언트에서는 사용하는 데 문제가 없었습니다.

0

명령을 함께 연결하고 이벤트를 사용하여 다른 명령에 완료, 성공, 실패 또는 취소 된 명령을 알리는 방법을 만들겠습니다. 관찰자 패턴 (http://en.wikipedia.org/wiki/Observer_pattern)에서 이러한 알림을 어떻게 전달할 수 있는지 확인하십시오. 또한 명령에 순환 종속성을 조심하여 두 명령이 서로 대기 중이면 어느 명령도 실행되지 않습니다. 아마도 이것을 구현하기 위해 이벤트를 사용할 것입니다.

0

스레드 풀을 사용하는 경우 요청 큐가있을 수 있습니다. 큐의 각 요청 개체에 종속 요청 모음을 추가 할 수 있습니다. 기본 요청이 완료되면 스레드 proc가 종속 요청을 기본 요청으로 대기열에 넣습니다.

class RequestObject { 
    // ... request details 
    List <RequestObject> dependentRequests; 
}

void PerformRequest (RequestObject request) { // ... perform the requested object foreach (var dr in request.dependentRequests) AddRequestToQueue (dr); }

관련 문제