문제

워크플로는 ASP.NET 양식 제출에 의해 시작되므로 SQL 지속성을 사용하고 웹 런타임에서 호스팅되는 Windows 워크플로 인스턴스가 있습니다.대부분의 경우 훌륭하게 실행되지만, 다음과 같은 작업을 수행해야 하는 경우도 발견했습니다.

nextTimer의 기한이 몇 시간이나 늦어진 것을 알았습니다.지속성 데이터베이스에서 ownerID 및 ownUntil 필드가 null인 경우도 있고 그렇지 않은 경우도 있습니다."잠금 해제됨" 및 "차단됨" 필드는 항상 둘 다 "1"입니다.

...그리고 워크플로 런타임은 "소유자" 필드가 채워져 있고 재활용을 통해 응용 프로그램 풀을 제거할 때까지 해당 필드를 다시 선택하지 않으며 그 이후에는 대부분 문제가 잘 진행됩니다. .오류가 없습니다(모든 항목 주위에 try/catch 블록이 있고 추적 파일에 잡힌 항목을 기록합니다). 따라서 그게 아닙니다.

지속성을 유발하는 지연 활동은 모두 1분으로 설정되었으며 런타임의 소유권 기간도 60초입니다.멈추는 코드는 항상 1분 이내에 완료되어야 합니다.

이 글을 쓰면서 앱 풀/앱 도메인의 재활용으로 인해 문제가 발생하는지 궁금합니다. 워크플로가 런타임에 어떤 메서드든 호출하려고 하면 앱 도메인/풀을 돌리느라 바쁘고 소유권 기간은 60초입니다.그 말은 그럴듯하게 들리는데, 이로 인해 제대로 재수화되지 않습니까?

그 우회로를 제외하고, 내가 보고 있는 이러한 동작의 원인은 무엇입니까?나는 멈춰 있는 워크플로를 풀어서 매일 런타임을 돌보고 싶지 않습니다.

도움이 되었습니까?

해결책

앱 도메인 재활용이 문제의 큰 부분을 차지할 가능성이 높습니다.IIS는 마지막 요청이 완료되자마자 AppDomain을 재활용합니다.그러나 해당 요청의 일부로 다른 스레드에서 실행 중인 코드는 표시되지 않습니다.이것이 IIS에서 호스팅할 때 ManualWorkflowSchedulerService를 사용하는 주된 이유 중 하나입니다.그러나 활성 타이머 옵션을 사용하면 여전히 백그라운드 스레드를 사용하여 워크플로 활동을 실행합니다.

또한 유휴 상태가 되는 즉시 워크플로를 언로드해야 합니다.가장 쉬운 방법은 SqlWorkflowPersistenceService에서 UnloadOnIdle 설정을 사용하는 것입니다.

PersistenceService는 소유권이 만료된 워크플로를 확인하지만 시작 시에만 확인합니다.따라서 IIS 작업자 프로세스를 다시 시작하면 추가 작업 없이 이전 워크플로도 다시 시작될 가능성이 높습니다.하지만 이것이 새로운 문제의 경우이기 때문에.....이전 소유권을 지우는 것만으로도 효과가 있습니다.이 경우 PersistenceService는 다음에 워크플로를 다시 로드해야 합니다.유일한 비결은 어떤 runitme ID가 오래되었고 어떤 것이 아닌지 아는 것입니다(값을 보유하는 속성은 공개되지 않습니다).

확인해야 할 또 다른 사항은 IIS 작업자 프로세스가 다시 로드된다는 것입니다.그렇지 않으면 WF 런타임이 없으므로 만료된 타이머를 확인할 수 없습니다.이 내용이 포함되어 있는 것처럼 들리지만 만일을 대비해서입니다.

다른 팁

워크 플로 인스턴스는 런타임에 고정되어 있습니다 (여러 워크 플로 런타임은 인스턴스가 모두 처리되지 않고 데이터베이스를 공유 할 수 있습니다). AppDomain이 재활용되면 런타임이 중지되어 인스턴스가 잠금 해제됩니다.

이것은 중복 일 수 있습니다. 나는 그것을 확인하지 않았지만 워크 플로 인스턴스를 잠금 해제하는 데 도움이되었습니다.

AppDomain.CurrentDomain.DomainUnload += ((sender, args) =>
                                             {
                                                 if (_runtime.IsStarted)
                                                     _runtime.StopRuntime();
                                             });
AppDomain.CurrentDomain.ProcessExit += ((sender, args) =>
                                            {
                                                if (_runtime.IsStarted)
                                                    _runtime.StopRuntime();
                                            });

DB와 웹 서버에서 시계를 확인 했습니까 (동일한 서버가 아닌 경우)? 워크 플로에 비슷한 문제가 있었으며 근본 원인은 DB와 웹 서버 시계가 동기화되지 않았기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top