创建实时工作流

 

发布日期: 2017年1月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online

与异步工作流类似,实时工作流可用于对真实业务流程进行建模和自动化。 它们可以选择需要用户输入,可以根据指定事件条件自动启动,也可以由用户手动启动。 实时工作流面向业务用户(例如业务分析师),实现与同步插件类似的功能,而不需要 .NET Framework 编程体验。 您可以在 Microsoft Dynamics 365 Web 应用程序或代码中创建异步或实时工作流。

有关实时工作流的一些要点包括以下各项:

  • 与异步工作流类似,使用 Workflow 实体记录进行定义。

  • 与同步插件类似,在事件执行管道的某一阶段执行。 实时工作流可以在核心操作之前(前期操作),核心操作之后(后期操作)或核心操作期间执行。 核心操作期间执行的实时工作流是自定义操作的实现。 像对插件操作一样,可以在一个阶段中对实时工作流进行排列。详细信息:管道阶段

  • 无论配置为按需运行还是响应事件运行,实时工作流都会立即运行,而不是排队在稍后运行。

  • 可以在工作流的已登录用户或负责人的安全上下文中运行。 但是,设置为按需运行的工作流始终在已登录用户的安全上下文中运行。

  • 不能包含任何延迟或等待活动。

  • 仅记录错误,且仅在启用日志的情况下记录。

  • 在当前事务中执行。 工作流和任何子工作流(异步工作流除外)中的所有活动都是单一事务的一部分。 异步子工作流进行排队,在单独的事务中执行。

  • 可以转换为异步工作流,且可以转换回实时。

本主题内容

所需的安全权限

在代码中创建实时工作流

将异步工作流转换为实时工作流,然后再转换回来

错误处理和回滚

打包实时工作流以进行分发

所需的安全权限

需要名为“激活实时流程”(prvActivateSynchronousWorkflow) 的安全权限才能激活实时工作流以便可以执行它们。 需要“执行工作流作业”(prvWorkflowExecution) 权限才能启动工作流。 由于实时工作流影响核心系统操作,建议仅向有经验的一小部分用户授予激活权限。

有关这些权限的详细信息,请参阅“安全角色”的

在代码中创建实时工作流

虽然 Microsoft Dynamics 365 (online) 支持实时工作流,但是必须在 Web 应用程序中以交互方式创建它们。 本节讨论的基于 XAML 的工作流仅受内部部署或 IFD 服务支持。 有关 XAML 工作流的详细信息,请参阅 自定义 XAML 工作流

可以通过创建 Workflow 实体记录在代码中创建实时工作流。 使用实体浏览器工具或 SDK 包中的 EntityMetadata.xlsx 电子表格,检查 Workflow 实体的属性元数据。若要查看您的组织的实体元数据,请安装浏览组织的元数据中描述的元数据浏览器解决方案。 您还可以在一个名为 EntityMetadata.xlsx 的 Excel 文件中查看非自定义组织的元数据,该文件包含在 SDK 下载的顶级文件夹中。 下载 Microsoft Dynamics CRM SDK 包。

以下示例将创建异步工作流的代码与创建实时工作流的代码进行比较。


// Create an asynchronous workflow.
// The workflow should execute after a new opportunity is created.
Workflow workflow = new Workflow()
{
    // These properties map to the New Process form settings in the web application.
    Name = "Set closeprobability on opportunity create (async)",
    Type = new OptionSetValue((int)WorkflowType.Definition),
    Category = new OptionSetValue((int)WorkflowCategory.Workflow),
    PrimaryEntity = Opportunity.EntityLogicalName,
    Mode = new OptionSetValue((int)WorkflowMode.Background),

    // Additional settings from the second New Process form.
    Description = @"When an opportunity is created, this workflow" +
        " sets the closeprobability field of the opportunity record to 40%.",
    OnDemand = false,
    Subprocess = false,
    Scope = new OptionSetValue((int)WorkflowScope.User),
    TriggerOnCreate = true,
    AsyncAutoDelete = true,
    Xaml = xamlWF,

    // Other properties not in the web forms.
    LanguageCode = 1033,  // U.S. English                        
};
_workflowId = _serviceProxy.Create(workflow);

// Create a real-time workflow. 
// The workflow should execute after a new opportunity is created
// and run in the context of the logged on user.
Workflow workflow = new Workflow()
{
    // These properties map to the New Process form settings in the web application.
    Name = "Set closeprobability on opportunity create (real-time)",
    Type = new OptionSetValue((int)WorkflowType.Definition),       
    Category = new OptionSetValue((int)WorkflowCategory.Workflow),
    PrimaryEntity = Opportunity.EntityLogicalName,
    Mode = new OptionSetValue((int)WorkflowMode.Realtime),

    // Additional settings from the second New Process form.
    Description = @"When an opportunity is created, this workflow" +
        " sets the closeprobability field of the opportunity record to 40%.",
    OnDemand = false,
    Subprocess = false,
    Scope = new OptionSetValue((int)WorkflowScope.User),
    RunAs = new OptionSetValue((int)workflow_runas.CallingUser),
    SyncWorkflowLogOnFailure = true,
    TriggerOnCreate = true,
    CreateStage = new OptionSetValue((int)workflow_stage.Postoperation),
    Xaml = xamlWF,

    // Other properties not in the web forms.
    LanguageCode = 1033,  // U.S. English
};
_workflowId = _serviceProxy.Create(workflow);

实时工作流设置了一些异步工作流所没有的附加属性:

工作流属性

说明

Category

设置为 WorkflowCategory.Workflow

RunAs

指定在工作流负责人 (workflow_runas.Owner) 或已登录用户 (workflow_runas.CallingUser) 的安全上下文中执行工作流。

SyncWorkflowLogOnError

当为 true 时,错误会记录到 ProcessSession 记录。 与异步工作流不同,实时工作流执行不会记录到 System Job 记录。

CreateStageDeleteStageUpdateStage

标识运行工作流的事件执行管道中的阶段:在核心操作之前 (workflow_stage.Preoperation) 或在核心操作之后 (workflow_stage.Postoperation)。 您必须将该阶段与所需操作的触发器事件相匹配。 例如,如果 TriggerOnUpdatetrue,则还必须设置 UpdateStage

实时工作流不能在检索中执行。 除检索外,受支持的 Web 服务消息的其余部分映射到这三个受支持事件之一。 例如,分派或设置状态操作最终与更新相同。

Mode

这是执行模式。 将其设置为 WorkflowMode.Realtime

Rank

您可以通过设置排列,对某一阶段中插件和实时工作流的执行进行排序。 排列为 1 的所有插件或实时工作流在排列为 2 的之前执行,以此类推。

Xaml

设置为对实时工作流进行定义的 XAML 代码。

您可以在示例:在代码中创建实时的工作流程主题中查看用于插件实时工作流的完整示例代码。

将异步工作流转换为实时工作流,然后再转换回来

只要异步工作流不包含任何等待或延迟活动,就可以使用 UpdateRequest 将工作流从异步转换为实时,无需重新编写工作流。 您还可以使用 Web 应用程序以交互方式执行转换。 在执行转换之前,工作流必须处于草稿状态(未激活)。

将异步工作流转换为实时

  1. 为工作流创建 UpdateRequest

  2. 将工作流的 Mode 属性设置为 WorkflowMode.Realtime

  3. 根据需要,设置工作流的 CreateStageUpdateStageDeleteStage。 例如,如果工作流设置了 TriggerOnDelete,则还需要设置 DeleteStage 属性。

  4. 调用 Execute 方法,将更新请求作为参数传递。

将实时工作流转换为异步

  1. 为工作流创建 UpdateRequest

  2. 将工作流的 Mode 属性设置为 WorkflowMode.Background

  3. 调用 Execute 方法,将更新请求作为参数传递。

错误处理和回滚

在数据库事务期间执行的和将异常传递回平台的任何工作流活动会取消核心操作。 这导致核心操作的回滚(如果已发生核心操作)。 此外,事件之前和事件之后注册的尚未执行的任何插件或实时工作流将不会执行。 同一事件触发的任何异步工作流也不会执行。

如果您包括停止工作流 (TerminateWorkflow class) 活动,其中包含您的工作流中已取消的选项,则可以向该活动添加自定义状态消息(Reason 属性),消息中包含一行要在“业务流程错误”对话框中显示给用户的文本。

SyncWorkflowLogOnError 设置为 true 时,实时工作流错误记录在 ProcessSession 实体记录中。

打包实时工作流以进行分发

要分发工作流以便它可以导入 Microsoft Dynamics 365 组织,请将您的工作流添加到 Microsoft Dynamics 365 解决方案中。 可以使用 Web 应用程序通过导航到**“设置”>“自定义项”>“解决方案”**轻松完成此操作。 您还可以编写代码来创建解决方案。 有关解决方案的详细信息,请参阅使用解决方案打包和分发扩展

另请参阅

使用Dynamics 365 流程自动化业务流程
创建自己的行动
事件执行管道
编写插件以扩展业务流程

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权