We recently had a need to list suspended Workflow Foundation 4 instances hosted in Windows Server AppFabric from code, and here’s how to do it:
SqlInstanceQueryProvider provider = new SqlInstanceQueryProvider(); var providerArgs = new NameValueCollection { { "connectionString", _instanceStoreConnectionString } }; provider.Initialize("WfInstanceProviderA", providerArgs); InstanceQuery query = provider.CreateInstanceQuery(); var args = new InstanceQueryExecuteArgs { InstanceStatus = InstanceStatus.Suspended }; IAsyncResult asyncResult = query.BeginExecuteQuery(args, new TimeSpan(0, 0, 0, 30), null, null); IEnumerable instances = query.EndExecuteQuery(asyncResult);
By the way, this requires a reference to Microsoft.ApplicationServer.StoreManagement.dll which is installed with AppFabric.
Resuming the workflow instances can be done like this:
SqlInstanceControlProvider provider = new SqlInstanceControlProvider(); var providerArgs = new NameValueCollection { { "connectionString", _instanceStoreConnectionString } }; provider.Initialize("WfInstanceProviderA", providerArgs); InstanceControl control = provider.CreateInstanceControl(); foreach (InstanceInfo instanceInfo in instances) { InstanceCommand cmd = new InstanceCommand { CommandType = CommandType.Resume, InstanceId = instanceInfo.InstanceId, ServiceIdentifier = instanceInfo.HostInfo.HostMetadata }; // Not included in instanceInfo.HostInfo.HostMetadata... cmd.ServiceIdentifier["VirtualPath"] = "/EducationWorkflowServices/AktivitetService.xamlx"; IAsyncResult asyncResult = control.CommandSend.BeginSend(cmd, new TimeSpan(0, 0, 0, 30), null, null); control.CommandSend.EndSend(asyncResult); }
AppFabric also has some great PowerShell cmdlets for administration that can be used for the same thing. Here are a few examples:
Import-Module ApplicationServer Get-ASAppServiceInstance -status 'suspended' Get-ASAppServiceInstance -status 'suspended' | Resume-ASAppServiceInstance Get-ASAppServiceInstance -status 'suspended' | Stop-ASAppServiceInstance -Terminate Get-ASAppServiceInstance -status 'suspended' | Remove-ASAppServiceInstance Get-ASAppServiceInstance -InstanceId 95a25419-0d71-42c4-ab70-aa523ba603fc Get-ASAppServiceInstance -InstanceId 95a25419-0d71-42c4-ab70-aa523ba603fc | Suspend-ASAppServiceInstance
Yet another alternative is to query the AppFabric persistance store database directly using SQL:
SELECT * FROM [AppFabric_Application_Extensions].[System.Activities.DurableInstancing].[InstancesTable] WHERE IsSuspended=1
Choose the alternative most to your liking 🙂
/Emil