Gerenciamento de instância suspenso
O exemplo SuspendedInstanceManagement demonstra como gerenciar instâncias de fluxo de trabalho que foram suspensas. A ação padrão para WorkflowUnhandledExceptionBehavior é AbandonAndSuspend
. Isso significa que, por padrão, exceções não tratadas lançadas de uma instância de fluxo de trabalho hospedada no WorkflowServiceHost farão com que a instância seja descartada da memória (abandonada) e a versão durável/persistente da instância seja marcada como suspensa. Uma instância de fluxo de trabalho suspensa não poderá ser executada até que não tenha sido suspensa.
O exemplo mostra como um utilitário de linha de comando pode ser implementado para consultar instâncias suspensas e como dar ao usuário a opção de retomar ou encerrar a instância. Neste exemplo, um serviço de fluxo de trabalho lança intencionalmente uma exceção, fazendo com que ele seja suspenso. O utilitário de linha de comando pode ser usado para consultar a instância e, posteriormente, retomar ou encerrar a instância.
Demonstra
WorkflowServiceHost com WorkflowUnhandledExceptionBehavior e WorkflowControlEndpoint no Windows Workflow Foundation (WF).
Debate
O utilitário de linha de comando implementado neste exemplo é específico para a implementação do armazenamento de instâncias SQL que acompanha o .NET Framework 4.6.1. Se você tiver uma implementação personalizada do repositório de instâncias, poderá adaptar esse utilitário substituindo as WorkflowInstanceCommand
implementações no exemplo por implementações específicas para seu repositório de instâncias.
A implementação fornecida executa comandos SQL no repositório de instâncias SQL diretamente para listar instâncias suspensas e depende de uma WorkflowControlEndpoint adição ao WorkflowServiceHost para retomar ou encerrar as instâncias.
Para configurar, compilar e executar o exemplo
Este exemplo requer que os seguintes componentes do Windows estejam habilitados:
Servidor de Filas de Mensagens da Microsoft (MSMQ)
SQL Server Express
Configure o banco de dados do SQL Server.
Em um prompt de comando do Visual Studio, execute "setup.cmd" no diretório de exemplo SuspendedInstanceManagement, que faz o seguinte:
Cria um banco de dados de persistência usando o SQL Server Express. Se o banco de dados de persistência já existir, ele será descartado e recriado
Configura o banco de dados para persistência.
Adiciona IIS APPPOOL\DefaultAppPool e NT AUTHORITY\Network Service à função InstanceStoreUsers que foi definida ao configurar o banco de dados para persistência.
Configure a fila de atendimento.
No Visual Studio, clique com o botão direito do mouse no projeto SampleWorkflowApp e clique em Definir como Projeto de Inicialização.
Compile e execute o SampleWorkflowApp pressionando F5. Isso criará a fila necessária.
Pressione Enter para parar o SampleWorkflowApp.
Abra o console de Gerenciamento do Computador executando Compmgmt.msc em um prompt de comando.
Expanda Serviço e Aplicativos, Enfileiramento de Mensagens, Filas Privadas.
Clique com o botão direito do mouse na fila ReceiveTx e selecione Propriedades.
Selecione a guia Segurança e permita que Todos tenham permissões para Receber Mensagem, Espiar Mensagem e Enviar Mensagem.
Agora, execute o exemplo.
No Visual Studio, execute o projeto SampleWorkflowApp novamente sem depuração pressionando Ctrl+F5. Dois endereços de ponto de extremidade serão impressos na janela do console: um para o ponto de extremidade do aplicativo e, em seguida, outro do WorkflowControlEndpoint. Uma instância de fluxo de trabalho é então criada, e os registros de controle para essa instância aparecerão na janela do console. A instância do fluxo de trabalho lançará uma exceção fazendo com que a instância seja suspensa e anulada.
O utilitário de linha de comando pode ser usado para executar outras ações em qualquer uma dessas instâncias. A sintaxe para argumentos de linha de comando é a seguinte::
SuspendedInstanceManagement -Command:[CommandName] -Server:[ServerName] -Database:[DatabaseName] -InstanceId:[InstanceId]
Os comandos suportados são:
Query
,Resume
eTerminate
. A opção InstanceId só é necessária paraResume
eTerminate
operações.
Para limpar (Opcional)
Abra o console de Gerenciamento do Computador executando Compmgmt.msc.
Expanda Serviço e Aplicativos, Enfileiramento de Mensagens, Filas Privadas.
Exclua a fila ReceiveTx .
Para remover o banco de dados de persistência, execute cleanup.cmd.