Skip to main content

Introducing Formengine - The New Formbuilder, try for FREE formengine.io.

Schema versioning

Scheme Update

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.