VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • 通过AEC解读WF的核心原理(9)实现EventActivity

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  说明

  例子下载: http://files.cnblogs.com/wxwinter/aec9.rar

  本例同时实现了CallExternalMethod与HandleExternalEvent的功能

  本例主要演示了,WorkflowRuntimeService,WorkflowQueuingService,WorkflowQueue,实例.EnqueueItemOnIdle方法,IEventActivity,IActivityEventListener<QueueEventArgs>的使用技巧

  IEventActivity

 

//实现IEventActivity的[事件的订阅]方法

 

  public void Subscribe(ActivityExecutionContext parentContext, IActivityEventListener<QueueEventArgs> parentEventHandler)

//实现IEventActivity的[取消事件的订阅]方法

 

  public void Unsubscribe(ActivityExecutionContext parentContext, IActivityEventListener<QueueEventArgs> parentEventHandler)

//实现IEventActivity的[WorkflowQueue名称]属性

 

  public IComparable QueueName

 

  将IEventActivity活动放入在ListenActivity中时,ListenActivity启动时首先调用Subscribe方法,表示开始订阅事件,可在这儿做初始化工作。

  当ListenActivity活动从消息队列中收到一条消息时,它将调用Unsubscrible方法,表示已经收到消息,可在此方法中从消息队列中读取消息

 

在ListenActivity中的IEventActivity活动的执行过程为 Subscribe()

 

  Unsubscribe()

  Execute()

不在ListenActivity中的活动的执行过程为 Execute()

 

  等待 Queuing 事件

 

  IActivityEventListener<QueueEventArgs>

//实现IActivityEventListener<QueueEventArgs> 的[发生订阅事件时的处理过程]事件方法
  
public void OnEvent(object sender, QueueEventArgs e)

  例子 自定义功能类

public interface 通信接口
{
string Text { set; get; }
IComparable QueueName { set; get; }
void myTest(string v);
}
public class 通信类 : WorkflowRuntimeService , 通信接口
{
public string Text
{ set; get; }
  
public IComparable QueueName
{ set; get; }
  
public void myTest(string v)
{
System.Console.WriteLine("一个外部实现:" + v);
}
  
public void NextStep(Guid instanceID, object inputData)
{
WorkflowInstance instance = Runtime.GetWorkflow(instanceID);
instance.EnqueueItemOnIdle(QueueName, inputData, null, null);
}
}

  自定义Activity

通过AEC解读WF的核心原理(九)实现IEventActivity

public class Activity1 : Activity, IActivityEventListener<QueueEventArgs> , IEventActivity
{
  
public string Text
{ set; get; }
  
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
if (myProcessAEC(executionContext))
{
return ActivityExecutionStatus.Closed;
}
else
{
Subscribe(executionContext, this);
return ActivityExecutionStatus.Executing;
}
}
  
private bool myProcessAEC(ActivityExecutionContext provider)
{
WorkflowQueuingService queueService = provider.GetService<WorkflowQueuingService>();
if (queueService.Exists(this.QueueName) && queueService.GetWorkflowQueue(this.QueueName).Count > 0)
{
object inputData = queueService.GetWorkflowQueue(this.QueueName).Dequeue();
System.Console.WriteLine("外部传入的数据:" + inputData.ToString());
  
通信接口 obj = provider.GetService<通信接口>();
  
this.Text = obj.Text;
return true;
}
return false;
}
  
//实现IActivityEventListener<QueueEventArgs> 的[发生订阅事件时的处理过程]事件方法
  
public void OnEvent(object sender, QueueEventArgs e)
{
ActivityExecutionContext aec = sender as ActivityExecutionContext;
if (myProcessAEC(aec))
{
Unsubscribe(aec, this);
aec.CloseActivity();
}
}
  
//实现IEventActivity的[WorkflowQueue名称]属性
public IComparable QueueName
{
get { return this.QualifiedName; }
}
  
//实现IEventActivity的[事件的订阅]方法
public void Subscribe(ActivityExecutionContext parentContext, IActivityEventListener<QueueEventArgs> parentEventHandler)
{
WorkflowQueuingService queueService = parentContext.GetService<WorkflowQueuingService>();
  
if (queueService != null && !queueService.Exists(this.QueueName))
{
WorkflowQueue queue = queueService.CreateWorkflowQueue(this.QueueName, false);
  
queue.RegisterForQueueItemAvailable(parentEventHandler);
  
通信接口 obj = parentContext.GetService<通信接口>();
if (obj != null)
{
obj.QueueName = this.QueueName;
obj.myTest(Text);
obj.Text=this.Text;
}
}
}
//实现IEventActivity的[取消事件的订阅]方法
public void Unsubscribe(ActivityExecutionContext parentContext, IActivityEventListener<QueueEventArgs> parentEventHandler)
{
WorkflowQueuingService queueService = parentContext.GetService<WorkflowQueuingService>();
if (queueService != null && queueService.Exists(this.QueueName))
{
queueService.GetWorkflowQueue(this.QueueName).UnregisterForQueueItemAvailable(parentEventHandler);
queueService.DeleteWorkflowQueue(this.QueueName);
}
}
}

  测试用工作流

通过AEC解读WF的核心原理(九)实现IEventActivity

  public class Workflow1: SequentialWorkflowActivity

{
private CodeActivity codeActivity2;
private Activity1 activity12;
private CodeActivity codeActivity1;
private Activity1 activity11;
  
    public Workflow1()
    {
      InitializeComponent();
    }
[System.Diagnostics.DebuggerNonUserCode]
private void InitializeComponent()
{
this.CanModifyActivities = true;
this.codeActivity2 = new System.Workflow.Activities.CodeActivity();
this.activity12 = new wxwinterAecTest.Activity1();
this.codeActivity1 = new System.Workflow.Activities.CodeActivity();
this.activity11 = new wxwinterAecTest.Activity1();
//
// codeActivity2
//
this.codeActivity2.Name = "codeActivity2";
this.codeActivity2.ExecuteCode += new System.EventHandler(this.codeActivity2_ExecuteCode);
//
// activity12
//
this.activity12.Name = "activity12";
this.activity12.Text = "activity12";
//
// codeActivity1
//
this.codeActivity1.Name = "codeActivity1";
this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity1_ExecuteCode);
//
// activity11
//
this.activity11.Name = "activity11";
this.activity11.Text = "activity11";
//
// Workflow1
//
this.Activities.Add(this.activity11);
this.Activities.Add(this.codeActivity1);
this.Activities.Add(this.activity12);
this.Activities.Add(this.codeActivity2);
this.Name = "Workflow1";
this.CanModifyActivities = false;
  
}
  
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
System.Console.WriteLine("activity11收到:" + this.activity11.Text);
}
  
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
System.Console.WriteLine("activity12收到:" + this.activity12.Text);
}
  }

  宿主

class Program
{
static void Main()
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
通信类 obj = new 通信类();
workflowRuntime.AddService(obj);
  
workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);
workflowRuntime.WorkflowIdled+=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
instance.Start();
  
String s;
s = System.Console.ReadLine();
obj.Text = s;
obj.NextStep(instance.InstanceId, DateTime.Now.ToString());
  
s = System.Console.ReadLine();
obj.Text = s;
obj.NextStep(instance.InstanceId,DateTime.Now.ToString());
  
System.Console.ReadLine();
}
  
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
System.Console.WriteLine("WorkflowIdled");
System.Console.WriteLine("请输入字符:");
}
  
static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
System.Console.WriteLine("Terminated" + e.Exception.Message);
}
  
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
System.Console.WriteLine("WorkflowCompleted");
}
  
}

  运行结果

通过AEC解读WF的核心原理(九)实现IEventActivity


相关教程