워크플로의 상태를 SqlWorkflowInstanceStore유지하는 워크플로의 새 인스턴스가 만들어지면 서비스 호스트는 인스턴스 저장소에서 해당 서비스에 대한 항목을 만듭니다. 그런 다음 워크플로 인스턴스가 처음으로 SqlWorkflowInstanceStore에 보관되면 현재 인스턴스 상태가 저장됩니다. 워크플로가 Windows 프로세스 정품 인증 서비스에서 호스트되는 경우 인스턴스가 처음으로 지속될 때 서비스 배포 데이터도 인스턴스 저장소에 기록됩니다.
워크플로 인스턴스가 유지되지 않는 한 지속되지 않는 상태입니다. 이 상태에서는 애플리케이션 도메인 재활용, 호스트 오류 또는 컴퓨터 오류 후에 워크플로 인스턴스를 복구할 수 없습니다.
비지속성 상태
지속되지 않은 지속성 워크플로 인스턴스는 다음과 같은 경우 비지속성 상태로 유지됩니다.
워크플로 인스턴스가 처음으로 유지되기 전에 서비스 호스트가 충돌합니다. 워크플로 인스턴스는 인스턴스 저장소에 남아 있으며 복구되지 않습니다. 상관 관계가 있는 메시지가 도착하면 워크플로 인스턴스가 다시 활성화됩니다.
워크플로 인스턴스는 처음으로 영구히 저장되기 전에 예외를 겪습니다. 반환된 UnhandledExceptionAction에 따라 다음과 같은 시나리오가 발생합니다.
UnhandledExceptionAction는 Abort로 설정됩니다: 예외가 발생하면 서비스 배포 정보가 인스턴스 저장소에 기록되고 워크플로 인스턴스가 메모리에서 비워집니다. 워크플로 인스턴스는 지속되지 않는 상태로 유지되며 다시 로드할 수 없습니다.
UnhandledExceptionAction 가 설정 Cancel 되거나 Terminate: 예외가 발생하면 서비스 배포 정보가 인스턴스 저장소에 기록되고 활동 인스턴스 상태가 Closed로 설정됩니다.
언로드된 비지속성 워크플로 인스턴스가 발생할 위험을 최소화하려면 워크플로를 수명 주기 초기에 유지하는 것이 좋습니다.
비지속형 인스턴스 검색 및 제거
SqlWorkflowInstanceStore는 인스턴스 저장소에서 비영구적 워크플로 인스턴스를 제거하지 않습니다. 또한 비지속형 워크플로 인스턴스가 연결된 만료된 잠금 소유자도 제거하지 않습니다.
관리자는 인스턴스 저장소에서 비지속형 인스턴스를 주기적으로 확인하는 것이 좋습니다. 관리자는 이 워크플로가 상관 관계가 있는 메시지를 받지 않는다는 것을 알고 있는 한 인스턴스 저장소에서 해당 인스턴스를 제거할 수 있습니다. 예를 들어 인스턴스가 몇 달 동안 데이터베이스에 있었고 워크플로의 수명이 일반적으로 며칠인 것으로 알려진 경우 이 인스턴스가 충돌한 초기화된 인스턴스라고 가정하는 것이 안전합니다.
SQL 워크플로 인스턴스 저장소에서 비지속형 인스턴스를 찾으려면 다음 SQL 쿼리를 사용할 수 있습니다.
이 쿼리는 유지되지 않은 모든 인스턴스를 찾아 ID 및 생성 시간(UTC 시간에 저장됨)을 반환합니다.
select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0
이 쿼리는 유지되지 않고 로드되지 않은 모든 인스턴스를 찾아 ID 및 생성 시간(UTC 시간에 저장됨)을 반환합니다.
select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and CurrentMachine is NULL
이 쿼리는 지속되지 않은 일시 중단된 인스턴스를 모두 찾아 ID, 생성 시간(UTC 시간에 저장), 일시 중단 이유 및 예외 이름을 반환합니다.
select InstanceId, CreationTime, SuspensionReason, SuspensionExceptionName from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and IsSuspended = 1
비지속형 인스턴스를 삭제할 때는 주의해야 합니다. 일반적으로 WorkflowServiceHost에 의해 생성된 인스턴스 중 지속되지 않는 상태로 일시 중단되거나 로드되지 않은 인스턴스를 제거하는 것은 안전합니다. 이러한 특정 인스턴스는 올바른 인스턴스 ID를 대체하여, 다음 SQL 명령을 사용하여 [System.Activities.DurableInstancing].[Instances]
보기에서 삭제함으로써 저장소에서 삭제할 수 있습니다.
delete [System.Activities.DurableInstancing].[Instances]
where InstanceId=’078a9bc4-ada5-4f9e-8cce-b0eb0009995f’
경고
방금 만들어졌으며 아직 유지되지 않은 인스턴스를 포함하므로 모든 비지속형 인스턴스를 제거하는 것은 권장되지 않습니다.
.NET