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则允许进行动态更新,否则就会抛 出异常。

动态更新实例

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


工作流代码如下:

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);
}
}

时间: 2024-09-15 15:04:14

WF中的动态更新的相关文章

在java EE中怎么动态更新结果集

问题描述 在javaEE中我在一个Medit.jsp页面上实现一对数据库中所有用户信息的查询,并且在表的后面加了两个字段,"编辑"和"删除"在表中,每一行的后面都有这两个字段,并且加了链接,我希望在浏览时,只要点击某一行后面的"编辑"和"删除",系统就会对那一行执行相应的操作.而且在点击"编辑"时,那一行的内容变为可更改状态.希望有能之有能够及时给予解决..我是初学者,应该不会太麻烦吧 解决方案 解决方案二

全自动:Windows 2000 中的 DNS 动态更新 (转)

全自动:Windows 2000 中的 DNS 动态更新 域名系统 (DNS) 为域名(比如 ftp.microsoft.com)与相应 IP 地址或多个地址的解析提供了一个方法.DNS 是一个可缩放的分布式资源记录数据库,可为最大的网络(如 Internet)提供名称解析.在 DNS 中,A(地址)资源记录提供名称对 IP 地址的解析,PRT(指针)资源记录提供 IP 地址对名称的解析.但是,最早设计 DNS 时所有运行 TCP/IP 的计算机都是手工配置的.用特定的 IP 地址手工配置一台计

《DNS与BIND(第5版)》——10.2 DNS动态更新

10.2 DNS动态更新 Internet(即通常使用TCP/IP协议的网络)如今变得愈加动态化.许多大型企业使用DHCP动态分配IP地址.几乎所有的ISP都使用DHCP为其拨号及使用线缆调制解调器(cable modem)的用户分配IP地址.为适应这种变化,DNS需要提供动态增加和删除记录的功能.RFC 2136描述了这种机制,称为DNS动态更新. BIND 8和9支持RFC 2136提出的动态更新功能.此功能允许经过授权的更新者(updater),在区域中的权威名称服务器上增加和删除资源记录

JVM TI学习(2) 如何动态更新JVM中的class文件

在一个运营系统中,如果出现业务方法变更,而我们使用的应用服务器不支持热部署的话,那么重启可能是更新的唯一选择.目前多数应用服务器不支持热部署,包括生产模式下的weblogic.之所以说是生产模式,weblogic在开发模式下是支持这种动态更新的,即我们只要替换部署目录下的类文件,重新访问时可以看到新业务方法生效,而且即使在生产模式下,weblogic也能"支持"动态更新,但做法上比较麻烦,需要使用version信息控制应用,这个功能weblogic9就开始提供,但好像很少有客户这么用过

iOS中动态更新补丁策略JSPatch运用基础二

iOS中动态更新补丁策略JSPatch运用基础二 一.引言     上篇博客中介绍了iOS开发中JSPatch引擎进行动态热修复的一些基础功能,其中包括向Objective-C类中添加类方法与成员方法.添加临时成员变量,使用JavaScript调用原生的Objective-C属性和方法等.本篇博客将基于上一篇继续介绍Objective-C中的一些特殊数据类型在JavaScript文件中的使用方法,博客中大部分内容扩展自JSPatch开源git的wiki:https://github.com/ba

iOS中动态更新补丁策略JSPatch运用基础一

iOS中动态更新补丁策略JSPatch运用基础         JSPatch是GitHub上一个开源的框架,其可以通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Objective-C属性与方法.其框架小巧,代码简洁,并且通过系统的JavaScriptCore框架与Objective-C进行交互,这使其在安全性和审核风险上都有很强的优势.Git源码地址:https://github.com/bang590/JSPatch. 一.从一个官方的小de

在Android中实现Service动态更新UI界面(Service与主程序Activity之间的数据交互或控制)

案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 方案一:使用广播+Service 注册BroadcastReceiver 1.在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播. @Override protected void onStart() {//重写onStart方法 dataReceiver = new DataReceiver(); IntentFilter

动态更新项目中使用的jquery包

问题描述 动态更新项目中使用的jquery包 [b][b]我在项目中,把js分离了 ,把些在页面的 js 放在 自己建立的jquery 文件里,然后动态引用到页面上,但是因为很多浏览器在一定的时间里没有把上次下载下来的jquery清空,我发布在服务器的上 最新jquery 不能及时被下载到 客户本地的浏览器缓存里,想用一个,版本号或着其他方式 ,来实现我发布最新的jquery浏览器就去到服务器抓取最新的jquery包.[/b][/b][b][/b] 解决方案 将你的jquery放入一个文件中,其

WPF中动态更新TextBlock文字中的超链接,文本

1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBlock><Hyperlink> <TextBlock  x:Name="TextBlockNeedChange" Text="改变的文本" />             </Hyperlink></TextBlock>