Richard210363
Richard210363

Reputation: 8406

How do I cancel and roll back part of a workflow

I have a very long running workflow that moves video files around between video processing devices and then reports the files state to a database which is used to drive a UI

At times the users press a button on the UI to "Accept" a file into a video storage server. This involves copying a file from one server to another.]

They have asked if this activity can be cancelled.

I've looked at the wf4 documentation and I can't see a way to roll back part of a workflow.

Is this possible and what technique should I use.

Upvotes: 1

Views: 1806

Answers (3)

Maurice
Maurice

Reputation: 27632

The are two basic inbuild activities for reverting work.

  1. The TransactionScope for ACID transaction
  2. The Compensable activity for long running work.

With the Compensable activity you add activities to the compensation handler to undo work previously done. The Compensate activity can be used to trigger compensation. If there is no compensation you will get the confirmation handler either at the end of the workflow automatically or when you use the Conform activity.

See A Developer's Introduction to Windows Workflow Foundation (WF) in .NET 4 by Matt Milner for more details.

Upvotes: 2

Mike Perrenoud
Mike Perrenoud

Reputation: 67918

Okay, so let's first say that the processing of "rolling back" what was already uploaded will have to be done by hand, so where ever you're storing those chunks you'll need to clean up by hand when they cancel.

Now, on to the workflow itself, in my opinion you could setup your FlowChart like this:

FlowChart

Process Loop Part 1

Process Loop Part 2

Alright so let's break down this workflow. The entire service should be correlated on some client key so that way you can start the service with Start once per client to keep the startup costs down.

Next, when said client wants to start a transfer you'll call BeginTransfer which will move into the transfer loop. The transfer loop is setup so that you can cancel between chunks if necessary by calling CancelTransfer.

That same branch, in this model, is used to finish the transfer as well because it gets out of the loop, so when your done transferring chunks just call CancelTransfer (if you don't like that just setup a different branch that looks exactly the same).

Finally, when you're in the process loop, you can SoftExit the entire workflow and shut it down so that you can kill it softly if there is necessary maintenance or when the client is finished with its connection it needs to call SoftExit to dispose of it.

Upvotes: 1

Diego
Diego

Reputation: 36176

not sure if I totally understand your scenario but I think you would need to run your transfer process on an asynchronous thread, that from time to time check a "cancel" variable to perform a rollback. This variable can be modified on the main thread on your UI.

Of course, this will allow you to cancel between transfers, not in the midle on one single transfer.

Upvotes: 1

Related Questions