WF: How to add your own task in the workflow runtime engine batching mechanism ?
The goal of this post is to describe the mechanism to create and add your own service in the workflow runtime engine.
Situation: You would like that each time the SqlWorkflowPersistenceService is called by the workflow runtime, it call your own service, in a transactional scope (if your service or the persistence service failed, a rollback is apply).
1: You have to create your service:
Create a class (in a separate project) wich implements IPendingWork. Add reference of this project in the host and workflow project.
namespace TransactionalService
{
public class TransactionalService : IPendingWork
{
void IPendingWork.Commit(System.Transactions.Transaction transaction, ICollection items)
{
foreach (MyExternalDataEventArgs request in items)
{
Console.WriteLine(request.Commande.Nom);
}
}
bool IPendingWork.MustCommit(ICollection items)
{
return true;
}
void IPendingWork.Complete(bool succeeded, ICollection items)
{
Console.WriteLine(succeeded);
}
}
}
2: Add your service in the workflowruntime
In your Host:
…
workflowRuntime.AddService(new TransactionalService.TransactionalService());
workflowRuntime.StartRuntime();
3: add your pending work items to the current work batch
In your Workflow:
TransactionalService.TransactionalService service = new TransactionalService.TransactionalService(); //Or by the getService()
WorkflowEnvironment.WorkBatch.Add(service, MyArgs);
When the runtime engine batching will be executed, he will call all services which implements IPendingWork (SqlTrackingService, SqlWorkflowPersistenceService and you service):
1: MustCommit (check if you want the method Commit will be called) ,
2: if yes, he will call Commit method,
3: The complete method allow us to know the state of the process.