2011-12-09 3 views
0

주로 동일한 요소로 구성된 워크 플로가 있습니다.
각 요소는 다음과 같이 정의된다 :모든 워크 플로 시퀀스가 ​​유휴 상태 일 때 감지

Workflow element

단순히 시퀀스에서 이러한 소자를 적층 할 수있다 플로는,이 병렬로 실행할 수 있고, 그것을 등간에 분파 수도 - 완전한 자유를위한 워크 플로우 디자이너. 모든 것이 WCF 서비스로 호스팅되지만 가능하다면 그 정보에 의존하지 않는 것이 좋습니다.

이 모든 설정의 높은 수준의 아이디어

은 다음
  1. 워크 플로가 시작되면, 이러한 요소를 신속, 차례로, 최대 발사 상단 조건 분기를 스킵 시작합니다. 이전 요소를 완료하면 워크 플로에 정의 된대로 다음 요소가 시작됩니다.
  2. 어떤 시점에서 조건 [B]이 올 바르면 요소는 아래쪽 분기를 가져와 WCF 호출을 기다릴 수 있습니다.
  3. 조만간 모든 요소가 이러한 종류의 중지 상태가되거나 워크 플로가 모두 종료됩니다.

내가 필요한 것은 모든 요소가 WCF 호출을 대기하기 위해 멈추는 순간을 포착하는 것입니다.

그 시점에서 워크 플로의 추가 흐름에 영향을 줄 수있는 계산을 수행해야합니다. 그러므로 나는 그 순간을 정확하게 잡아야한다.

일부 노트 :

  1. 나는 그 계산을하기 전에 더 WCF 호출이 올 것이라는 점을 보장합니다. 따라서 WCF 호출과 관련된 가능한 경쟁 조건이 범위를 벗어납니다.
  2. 제어 흐름을 제어하는 ​​응용 프로그램이 없습니다. 즉, IIS에서 호스팅되므로 예고없이 다시 시작될 수 있으며 타이머, 장기 실행 루프, 메시지 펌프 등을 설정할 수 없습니다.
  3. 워크 플로 디자인을 제어하지 않습니다.
  4. 그러나 요소의 디자인을 완전히 제어합니다. 사실,이 요소는 실제로 NativeActivity입니다 (다이어그램이 Visio에서 나온 이유입니다 :-) 내가 소스 코드를 제어한다는 것입니다.
  5. 나는 또한 어느 정도 호스팅 환경을 제어한다. 즉, 워크 플로가 호스팅되는 웹 응용 프로그램을 수정할 수 있습니다.
  6. 전체 워크 플로는 비즈니스 개체에 "첨부"되며 모든 요소는 해당 요소에 액세스 할 수 있습니다.

답변

0

이렇게하는 가장 좋은 방법은 TrackingParticipant 인 확장 프로그램을 만드는 것입니다. 이 확장은 Track 메서드의 모든 추적 레코드를받습니다. 그런 다음 WorkflowInstanceStateRecord를 수신하고 상태가 "유휴"이면 워크 플로가 유휴 상태임을 알게됩니다. 액티비티는이 확장 프로그램에 액세스하여 데이터를 받거나 여기에서 메서드를 호출 할 수 있습니다.

이것은 내가 사용한 기술입니다. Introduction to State Machine Hands On Lab

+0

주셔서 감사합니다. 하나. 'WorkflowInstanceStateRecord'라는 클래스가 보이지 않습니다. 'TrackingParticipant의 첫 번째 인수.Track' 메쏘드는'TrackingRecord'이며'State' 또는 비슷한 이름의 프로퍼티를 가지고 있지 않습니다. 또한 워크 플로 호스트로 이동하여 ID로 워크 플로 인스턴스를 가져올 수있는 서비스 위치 지정자가 표시되지 않습니다. 어떤 도움이 필요합니까? –

+0

아, 알겠습니다! WorkflowInstanceRecord는 상태가 없습니다. 지금 발견 했어. 내가 파고있는 동안 기다려라. –

+0

좋아, 다행히 추적 참가자와 함께 침묵의 순간을 가로 챌 수있다. 하지만 이제는 그 참가자 내부에서 관련된 비즈니스 객체에 접근 할 수 없습니다. 내 활동은 워크 플로우 확장으로 등록 된 DI 컨테이너에서 저장소를 가져옵니다. 액티비티는 'NativeActivityContext'를 통해 DI 컨테이너에 접근 할 수 있습니다. 그러나 참가자는 어떻습니까? –

관련 문제