zoukankan      html  css  js  c++  java
  • 工作流服务Workflow Service(2):SendActivity

    无状态的工作流服务每次调用服务都会创建一个新的工作流实例。无状态的服务在客户端和服务器端不需要上下文交换。而有状态的则需要,
    在下面的例子中我们开发一个有状态的工作流服务,我们使用WSHttpContextBinding。

    1.首先定义IAddStatefulService接口,代码如下:

    namespace CaryWFLib
    {
        [ServiceContract]
        public interface IAddStatefulService
        {
            [OperationContract]
            void StartWorkflow();
    
            [OperationContract]
            Double Add(Double num1, Double num2);       
    
            [OperationContract]
            void StopWorkflow();
        }
    }

    2.然后我们设计我们的工作流,我们这次使用状态机工作流,如下图:

     wfwcf1

    ReceiveActivity的使用可以参考工作流服务Workflow Service(1):ReceiveActivity这篇文章。

    3.我们在IIS中宿主该工作流服务,完成后可以使用如下代码进行测试。

    namespace AddStatefulServiceConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                AddStatefulServiceClient client1 = new AddStatefulServiceClient();
                AddStatefulServiceClient client2 = new AddStatefulServiceClient();
                Console.WriteLine("Server endpoint: {0}",client1.Endpoint.Address.ToString());            
                client1.StartWorkflow();
                client2.StartWorkflow();
                double result;
                result = client1.Add(1, 2);
                Console.WriteLine("Client1 计算的结果为: {0}", result);                      
                result = client2.Add(1,2);
                Console.WriteLine("Client2 计算的结果为: {0}", result);            
                client1.StopWorkflow();
                client1.Close();
                client2.StopWorkflow();
                client2.Close();
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
            }
        }
    }
    4.除了使用上面的方法来调用工作流服务,我们还可是使用WF本身提供的SendActivity来调用工作流服务,我们新建一个顺序工作流控制
    台项目。在工作流设计器中我们拖入SendActivity,如下图:
    wfwcf2 

    我们还是像使用ReceiveActivity同样的方式来设置SendActivity的ServiceOperationInfo属性,ChannelToken是每一个SendActivity必须要正确的
    设置属性,通道令牌用来指定通道名称、通道范围和用于建立通道的终结点配置名称。Name属性为AddChannel,EndpointName属性为AddEndpoint,
    该属性与App.config中的相对应,还有OwnerActivityName属性为SendWorkflow。OwnerActivityName和Nam属性决定WCF使用的通信通道,
    我们的例子中所有的SendActivity的ChannelToken都是同样的设置,保证所有的服务操作都使用相同的通道,当相同的通道被使用,服务消息将会
    在同一个工作流服务实例交换。

    App.config如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <bindings>       
          <wsHttpContextBinding>
            <binding name="AddBindingConfig"
              openTimeout="00:00:30" sendTimeout="00:00:30"
              receiveTimeout="00:00:30" closeTimeout="00:00:30" >
            </binding>
          </wsHttpContextBinding>
        </bindings>
        <client>    
          <endpoint address="http://localhost/CaryWFWCF/AddStatefulServiceWorkflow.svc"       
            binding="WSHttpContextBinding"
            bindingConfiguration="AddBindingConfig"
            contract="CaryWFLib.IAddStatefulService"
            name="AddEndpoint">
            </endpoint>
        </client>
      </system.serviceModel>
    </configuration>

    5.测试程序如下:

    namespace WorkflowConsoleSend
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    AutoResetEvent waitHandle = new AutoResetEvent(false);
                    workflowRuntime.WorkflowCompleted += delegate(
                        object sender, WorkflowCompletedEventArgs e)
                    {
                        Console.WriteLine("result is {0}",
                            e.OutputParameters["Result"]);                   
                        waitHandle.Set();
                    };
                    workflowRuntime.WorkflowTerminated += delegate(
                        object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };
    
                    //create channel manager service in order to manage and
                    //reuse WCF channels. 
                    workflowRuntime.AddService(new ChannelManagerService());
    
                    Dictionary<String, Object> parameters
                        = new Dictionary<string, object>();
                    parameters.Add("Num1", 1);
                    parameters.Add("Num2", 2);
    
                    WorkflowInstance instance = workflowRuntime.CreateWorkflow(
                        typeof(WorkflowConsoleSend.SendWorkflow), parameters);
                    instance.Start();
    
                    waitHandle.WaitOne();
    
                    Console.WriteLine("Press any key to exit");
                    Console.ReadKey();
                }
            }
        }
    }

    ChannelManagerService 负责根据在活动 ChannelToken 中定义的通道令牌,创建 SendActivity 的通道。

  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/carysun/p/SendActivity.html
Copyright © 2011-2022 走看看