Schema versioning
There are two strategies for updating the schemes of running processes:
- The old process uses the old scheme;
- The old process is updated on a new scheme.
Note that new processes always use new schemes in both strategies. Workflow Engine supports both strategies and their
combinations. On the other hand, the current or most actual version of a scheme is kept in the database table WorkflowScheme
.
Launching scheme update
Workflow Engine considers a scheme obsolete in case IsObsolete = true is attributed to it in the WorkflowProcessScheme
table (scheme). This attribute is set by default by scheme designer upon its saving. This behavior may be changed by
calling the DesignerAPI
method in the following way (refer to the Designer
section):
var res = WorkflowInit.Runtime.DesignerAPI(parameters, filestream, false);
You may also set the IsObsolete attribute by calling the following method:
WorkflowInit.Runtime.SetSchemeIsObsolete("SchemeCode");
In case you use a relational database, you may set the IsObsolete attribute with an SQL script.
If is needed to create a process or update the scheme of an existing process, but there are no up-to-date
(IsObsolete = false) schemes in the WorkflowProcessScheme
table (object), a scheme generator will be launched. Scheme
generator is an object implementing the IWorkflowGenerator
interface, which was conveyed to WorkflowRuntime
during configuration. This object will generate a new up-to-date scheme and put it into the WorkflowProcessScheme
table (object). Once the new scheme is created, the data related to it is saved and the scheme versioning is completed
accordingly by setting the field: IsObsolete = false
in this database table.
The old process uses a new scheme
Updating a scheme of the running process to a new scheme may be both manual and automatic.
Automatic update
Workflow Engine supports automatic update of a scheme to a new one upon receiving of the list of available commands. In
other words, if a scheme is obsolete, it will be updated for a certain process immediately after
calling WorkflowInit.Runtime.GetAvailableCommands(processId, identityId);
. Thus, automatic update occurs in a lazy
mode when it is necessary. In order to enable automatic updates for schemes of existing processes, the following
conditions should be satisfied:
-
Update should be explicitly allowed during configuration of the
WorkflowRuntime
object:runtime.SwitchAutoUpdateSchemeBeforeGetAvailableCommandsOn()
-
The Auto scheme update value of the Activity, in which a process scheme will be automatically updated, should equal true.
Manual update
Manual scheme update occurs after calling the following WorkflowRuntime
object’s functions:
WorkflowInit.Runtime.UpdateSchemeIfObsolete(processId);
The abovementioned UpdateSchemeIfObsolete
method version takes the Activity’s Auto scheme update property into
account. In case this property of the Current Activity equals false, a scheme won’t be updated. In order to ignore this
property’s value, use the following code:
WorkflowInit.Runtime.UpdateSchemeIfObsolete(processId, false);
After each process scheme update, the OnSchemaWasChanged
event is called, whose handler allows you to change the
current Activity of a process if it is not specified in the new scheme.
runtime.OnSchemaWasChanged += (sender, args) =>
{
var pi = runtime.GetProcessInstanceAndFillProcessParameters(args.ProcessId);
if (!pi.ProcessScheme.Activities.Any(a => a.Name == pi.CurrentActivityName))
{
var initialActivity = pi.ProcessScheme.InitialActivity;
pi.CurrentActivityName = initialActivity.Name;
runtime.PersistenceProvider.UpdatePersistenceState(pi,
TransitionDefinition.Create(initialActivity, initialActivity));
}
};
The old process uses the old scheme
In case you don’t need to update schemes of running processes, simply do not enable automatic scheme update during
the WorkflowRuntime
initialization. In case you don’t explicitly enable it by calling
the SwitchAutoUpdateSchemeBeforeGetAvailableCommandsOn
configuration method, the schemes of the running processes
won’t be updated.