`

WF中的动态更新

阅读更多

关于动态更新

在开发工作流时,我们会在工作流设计器中通过拖拽活动,设置属性等等来设计我们的工作流,我们希望我们在设计时定义好的工作流在运行时是不变的。但在实际中我们往往需要在运行时来改变工作流的架构,例如我们已经定义好的流程在没有结束时我们需要增加一个流程点,这个时候我们就需要使用动态更新来现实。在WF中我们也可以对正在运行的工作流实例添加删除活动,修改活动,规则条件等。当动态更新应用到工作流实例上时,只影响当前的工作流实例。其他的和将来的都不受影响,仍然使用原始的工作流定义。

动态更新不适合要进行整体更改的情况,因为这将导致工作流与原始设计原则产生极大差别。 在此类情况下,应设计一个新的工作流,而不是对正在运行的实例进行更改。动态更新不必重新编译和重新启动工作流。

何时进行动态更新

我们可以从工作流的执行线程内部和外部对正在运行的工作流实例进行动态更新。 在内部,我们可以使用CodeActivity,自定义活动等来实现,由于工作流运行在单一的线程上,所以我们执行动态更新的时候不会有其他的活动在执行。 在外部,我们实现动态更新就有严格规定,主要有以下状态可以在宿主程序中进行动态更新:

1. 工作流实例创建完成,但是没有开始。
2. 工作流实例是挂起状态,没有恢复。
3. 工作流实例是空闲状态。

我们可以在WorkflowRuntime的WorkflowCreated,WorkflowSuspened,WorkflowIdled事件中来完成动作更新。WorkflowCreated事件在workflowRuntime.CreateWorkflow方法调用后引发,使用使用SuspendActivity可以使工作流转到挂起状态,引发WorkflowSuspened事件。使用DelayActivity或HandleExternalEventActivity时工作流会进入Idle状态,引发WorkflowIdled事件。

动态更新的一般步骤

我们通过以下几个步骤进行动态更新:

1.所有对运行中工作流实例的建议的更改必须使用WorkflowChanges对象进行。首先我们要创建一个该类的实例,构造函数中需要需要传递被更改的工作流实例的根活动。如果你是使用内部实现动态更新的方式,你直接传递this关键字就可以了。如果你是在外部宿主程序中,你需要使用workflowinstance的GetWorkflowDefinition方法来获取工作流实例的根活动。

2.WorkflowChanges对象被创建后。该对象的TransientWorkflow属性返回该工作流实例的克隆版本,我们会对该克隆版本进行更改,然后将更改应用到运行中的工作流实例。

3.我们需要找到你要添加或删除活动的父活动,可以使用CompositeActivity的Activities属性或是使用GetActivityByName方法来确定父活动,然后使用Add或Insert方法来添加或插入新的活动。移除活动使用remove方法。

4.使用WorkflowChanges的Validate方法来验证,如果有错误会返回ValidationError对象集合。

5.验证通过后就可以更新了,如果是在外部实现动作更新需要调用workflowinstance对象的ApplyWrokflowChange方法,内部的话就调用当前对象的ApplyworkflowChanges方法。

阻止动态更新

顺序和状态机工作流都有一个DynamicUpdateCondition属性,如果你没有设置该属性工作流一直允许动态更新,当你设置了该属性后,当你在调用ApplyWorkflowChanges方法时就会去计算,如果为true则允许进行动态更新,否则就会抛出异常。

动态更新实例

下面我们分别使用在工作流内部和外部两种方式来举例说明,首先我们建立一个顺序型工作流控制台程序,工作流设计如下图:

DynamicUpdate1

工作流代码如下:

public sealed partial class CaryDynamicUpdateWorkflow: SequentialWorkflowActivity
{
    public CaryDynamicUpdateWorkflow()
    {
       InitializeComponent();
    }

    private void beforeSequence_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("beforeSequence执行了");
    }
    private void afterSequence_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("afterSequence执行了");
    }
    private void IsUpdate(object sender, ConditionalEventArgs e)
    {
        e.Result = true;
    }       
}

我们会在运行时给该工作流中的sequenceActivityContainer添加一个自定义活动PrintActivity,该自定义活动仅仅向控制台输出一条语句,代码如下:

public partial class PrintActivity : System.Workflow.ComponentModel.Activity
{
 public PrintActivity()
 {
     InitializeComponent();
 }

 protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
 {
    Console.WriteLine("自定义Print活动");
    return base.Execute(executionContext);
 }
}
1.宿主程序中,首先我们在workflowRuntime的WorkflowCreated事件中执行动态更新.代码如下:
static void workflowRuntime_WorkflowCreated(object sender, WorkflowEventArgs e)
{
    WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition());
    CompositeActivity sequenceContainer = wc.TransientWorkflow.GetActivityByName
        ("sequenceActivityContainer") as CompositeActivity;
    if (sequenceContainer != null)
    {
        PrintActivity print = new PrintActivity();
        sequenceContainer.Activities.Add(print);
        ValidationErrorCollection errors = wc.Validate();
        if (errors.Count == 0)
        {
            try { e.WorkflowInstance.ApplyWorkflowChanges(wc); }
            catch (Exception ex)
            {
                Console.WriteLine("引用动态更新异常:{0}", ex.Message);
            }
        }
        else
        {
            foreach (ValidationError error in errors)
            {
                Console.WriteLine("验证错误:" + error.ToString());
            }
        }
} }

2.运行程序后得到如下图结果:

DynamicUpdate2

3.从上图可以看出我们自定义的PrintActivity活动在运行时添加到了工作流实例当中,以上我们是在宿主程序中执行动态更新的,我们也可以在工作流内部来完成,例如我们将动态更新的代码放到我们重写的Initialize方法中,我们只要将如下代码做更改即可:

WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition());
try { e.WorkflowInstance.ApplyWorkflowChanges(wc); }

改为:
WorkflowChanges wc = new WorkflowChanges(this);
try { this.ApplyWorkflowChanges(wc); }

运行程序你可以得到和上面一样的结果。

4.如果你将工作流的DynamicUpdateCondition属性设为false,此时做动态更新时会抛出异常,如下图:

DynamicUpdate3 

分享到:
评论

相关推荐

    python源码基于YOLOV5安全帽检测系统及危险区域入侵检测告警系统源码.rar

    本资源提供了一个基于YOLOv5的安全帽检测系统及危险区域入侵检测告警系统的Python源码 该系统主要利用深度学习和计算机视觉技术,实现了安全帽和危险区域入侵的实时检测与告警。具体功能如下: 1. 安全帽检测:系统能够识别并检测工人是否佩戴安全帽,对于未佩戴安全帽的工人,系统会发出告警信号,提醒工人佩戴安全帽。 2. 危险区域入侵检测:系统能够实时监测危险区域,如高空作业、机械设备等,对于未经授权的人员或车辆进入危险区域,系统会立即发出告警信号,阻止入侵行为,确保安全。 本资源采用了YOLOv5作为目标检测算法,该算法基于深度学习和卷积神经网络,具有较高的检测精度和实时性能。同时,本资源还提供了详细的使用说明和示例代码,便于用户快速上手和实现二次开发。 运行测试ok,课程设计高分资源,放心下载使用!该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能,如增加多种安全帽和危险区域的识别、支持多种传感器数据输入、实现远程监控等。

    基于SpringBoot的响应式技术博客的设计和实现(源码+文档)

    本课题将许多当前比较热门的技术框架有机的集合起来,比如Spring boot、Spring data、Elasticsearch等。同时采用Java8作为主要开发语言,利用新型API,改善传统的开发模式和代码结构,实现了具有实时全文搜索、博客编辑、分布式文件存贮和能够在浏览器中适配移动端等功能的响应式技术博客。 本毕业设计选用SpringBoot框架,结合Thymeleaf,SpringData,SpringSecurity,Elasticsearch等技术,旨在为技术人员设计并实现一款用于记录并分享技术文档的技术博客。通过该技术博客,方便技术人员记录自己工作和学习过程中的点滴,不断地进行技术的总结和积累,从而提升自己的综合能力,并通过博客这一平台,把自己的知识、经验、教训分享给大家,为志同道合者提供一个相互交流、共同学习的平台,促使更多的人共同进步[9]。学习到别人的一些良好的设计思路、编码风格和优秀的技术能力,使笔者的设计初衷。本系统主要面向web端的用户,希望能给用户更多的学习和交流的选择。

    javalab 3.zip

    javalab 3.zip

    J0001基于javaWeb的健身房管理系统设计与实现

    该系统基于javaweb整合,数据层为MyBatis,mysql数据库,具有完整的业务逻辑,适合选题:健身、健身房、健身房管理等 健身房管理系统开发使用JSP技术和MySQL数据库,该系统所使用的是Java语言,Java是目前最为优秀的面相对象的程序设计语言,只需要开发者对概念有一些了解就可以编写出程序,因此,开发该系统总体上不会有很大的难度,同时在开发系统时,所使用的数据库也是必不可少的。开发此系统所使用的技术都是通过在大学期间学习的,对每科课程都有很好的掌握,对系统的开发具有很好的判断性。因此,在完成该系统的开发建设时所使用的技术是完全可行的。 学员主要实现的功能有:网站信息、课程信息、教练列表、我的信息、登录 员工主要实现的功能有:工资查询、会员管理、器材借还、健身卡管理、个人中心、登录 教练主要实现的功能有:工资查询、学员列表、个人中心 管理员是系统的核心,可以对系统信息进行更新和维护,主要实现的功能有:个人中心、学员管理、教练管理、网站信息管理、器械信息管理、课程信息管理。

    架构.cpp

    架构.cpp

    利用Python实现中文文本关键词抽取(三种方法)

    文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种:基于TF-IDF的关键词抽取、基于TextRank的关键词抽取、基于Word2Vec词聚类的关键词抽取,以及多种算法相融合的关键词抽取。笔者在使用前三种算法进行关键词抽取的学习过程中,发现采用TF-IDF和TextRank方法进行关键词抽取在网上有很多的例子,代码和步骤也比较简单,但是采用Word2Vec词聚类方法时网上的资料并未把过程和步骤表达的很清晰。因此,本文分别采用 1. TF-IDF方法 2. TextRank方 3. Word2Vec词聚类方法 实现对专利文本(同样适用于其它类型文本)的关键词抽取,通过理论与实践相结合的方式,一步步了解、学习、实现中文文本关键词抽取。

    演示Asm字节码插桩asmd-demo-master.zip

    演示Asm字节码插桩asmd-demo-master.zip

    VB+access干部档案管理系统(源代码+系统).zip

    档案是国家机构、社会组织在干部管理活动中形成的、记述和反映个人经历和德才表现等情况、以人头为单位集中保存以备查考的原始记录。 档案管理的目的是为了档案的利用。如果放松管理,无论对单位和对个人都会影响档案的利用。举个例子,如果应该进入档案的材料没及时归档,则对个人资料的记载就是不完整的,缺乏了这一部分的凭证,就无法出具相关证明。如果发生了损坏或丢失档案的情况,后果就更加严重,有的档案材料是难以重新建立的。档案的管理是与干部、流动手续的衔接密切相关的。以北京市人才服务中心为例,拥有着全市最大的档案管理中心,共保管了档案12万份。这些档案的利用率相对很高,表现在出具干部证明、婚育证明、出国政审、职称评定、工龄认定以及各种保险的相关手续等方面。档案中心的工作人员每天都要接待大量的企业用人中的查询、查阅。 档案好像是计划经济的产物,在市场经济条件下,随着人才流动潮流的涌现,人们思想观念上的放开,档案越来越被人们所冷落和忽视。到底档案对个人以及人力资源部意味着什么,放松对档案的管理会带来哪些后果呢? 目前我国的档案管理社会化趋势日益明显。非公有制单位,国有企业事业单位发展干部代理使流动人员档案管理

    本算法是结合“时间遗忘曲线”和“物品类….zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    JAVAWEB校园二手平台项目.zip

    JAVAWEB校园二手平台项目,基本功能包括:个人信息、商品管理;交易商品板块管理等。本系统结构如下: (1)本月推荐交易板块: 电脑及配件:实现对该类商品的查询、用户留言功能 通讯器材:实现对该类商品的查询、用户留言功能 视听设备:实现对该类商品的查询、用户留言功能 书籍报刊:实现对该类商品的查询、用户留言功能 生活服务:实现对该类商品的查询、用户留言功能 房屋信息:实现对该类商品的查询、用户留言功能 交通工具:实现对该类商品的查询、用户留言功能 其他商品:实现对该类商品的查询、用户留言功能 (2)载入个人用户: 用户登陆 用户注册 (3)个人平台: 信息管理:实现对商品的删除、修改、查询功能 添加二手信息:实现对新商品的添加 修改个人资料:实现对用户个人信息的修改 注销

    文档+程序动态四足机器人的自由模型预测控制

    Representation-Free Model Predictive Control for Dynamic Quadruped 专注于动态四足机器人的控制问题,特别强调了自由模型预测控制(Free-MPC)在该领域的应用。内容涉及自由MPC的原理、算法构建和在四足机器人动态平衡与运动控制中的实践案例。通过案例分析,揭示了自由MPC如何提升四足机器人在复杂地形下的适应性和稳定性。适合机器人工程师、控制理论研究者和相关专业学生阅读。使用场景包括机器人设计与开发、控制算法研究以及高等教育课程。目标是推动四足机器人控制技术的发展,增强其在多变环境中的表现。 关键词标签: 四足机器人 动态控制 自由模型预测控制 Free-MPC 机器人工程

    Building Android Apps in Python

    Building Android Apps in Python

    基于PHP实现的WEB图片共享系统(源代码+论文)

    基于PHP实现的WEB图片共享系统(源代码+论文)

    soxr-0.3.5-cp37-cp37m-win_amd64.whl.zip

    soxr-0.3.5-cp37-cp37m-win_amd64.whl.zip

    HeartShapeArtist

    这个 HeartShapeArtist 脚本使用 Python 的 turtle 图形库来绘制一个美丽的红色心形。它首先设置画布和画笔的属性,包括速度、颜色和背景,然后通过连续的小步骤绘制心形的上半部分和尖端,完成后进行颜色填充。该脚本适合用作学习如何使用 turtle 模块进行基本图形绘制的入门示例,也可以作为情人节或其他特殊场合的小项目。只需运行脚本,即可在屏幕上看到一个完美的心形图案展现出来。

    MySQL文件,省市区sql数据,微调

    参考了https://github.com/nhjclxc/District-SQL; 调整了北京优先级,删除了level = 4的数据;

    基于vhdl硬件描述语言设计数字时钟交通灯LCD12864液晶显二进制转BCD码等示quartus工程实验例程代码合集(22个)

    基于vhdl硬件描述语言设计数字时钟交通灯LCD12864液晶显二进制转BCD码等示quartus工程实验例程代码合集(22个): 12864液晶显示 1602lcd液晶显示 7段数码管 i2c总线 KEYSCAN MCU PS2 UART VGA 拨码开关 蜂鸣器 跑马灯 8位优先编码器 乘法器 二进制转BCD码 交通灯 减法器 加法器 四位比较器 多路选择器 数字时钟 简单状态机

    java作业管理系统设计(源代码+LW).zip

    java作业管理系统设计(源代码+LW)

    C#简易远程桌面管理工具管理所有的远程桌面信息方便连接

    简易远程桌面管理工具管理所有的远程桌面信息方便连接可以管理远程桌面地址及账号密码及备注。一键连接远程服务器。

    com.boc.bocsoft.phone.enterprise.db

    com.boc.bocsoft.phone.enterprise.db

Global site tag (gtag.js) - Google Analytics