EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

工作流服务器服务

XAF随附的工作流模块随附有工作流服务器服务。在适当时,它负责根据通过工作流模块创建的定义执行工作流实例。本主题描述配置和部署服务器所需的步骤。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E4523)中提供了完整的示例项目。

概述

服务器从数据库收集活动的工作流程定义,创建动态活动并将其传递给WorkflowServiceHost。服务器通过轮询数据库来工作,以定期执行以下检查。

  1. 重新检查数据库中存储的工作流定义,以查找可能的更改。例如,可以停用工作流程定义。在这种情况下,不应再执行相应的工作流实例。
  2. 重新检查存储在数据库中的对象,以查看它们是否与工作流程定义中指定的条件匹配。在启用“对象适合标准”选项的情况下,针对每个工作流程定义完成此操作。
  3. 服务器查找工作流程实例执行请求。这些请求由StartWorkflowController创建,如果存在工作流程定义,该请求将创建这些请求,并且在创建对象时必须执行这些请求。该StartWorkflowController跟踪创建新对象,并创建必要的工作流实例的执行时请求。工作流实例执行请求也可以手动创建。请参阅工作流设计基础
  4. 服务器查找工作流实例控制命令请求。这些请求是由RunningInstanceController创建的,以响应应用程序管理员执行CancelWorkflowInstanceTerminateWorkflowInstanceSuspendWorkflowInstanceResumeWorkflowInstance Actions的情况
注意
  • 该安全系统不适用于Workflow Server。在这种环境中,将同时从不同的WWF线程使用安全对象,而这些对象不是为这种情况而设计的,并且可能会发生“检测到跨线程操作”异常。此异常与UnitOfWork类有关,该类不能设计为同时在多个线程中使用,并且在检测到这种使用情况时会抛出此异常。该ThreadSafeDataLayer不参与到这个场景,它的使用并不能帮助避免这个例外。如果需要检测在Worklow Server环境中是否正在执行XAF模块中实现的代码,则不要为此目的使用安全系统。相反,您可以引入静态属性(例如IsWorkflowServer),然后从Workflow Server代码将其初始化为true。但是,您可以在客户端应用程序中将安全系统与工作流模块一起使用,没有任何限制。
  • WorkflowInstanceStore类不支持多个工作流程主机访问同一个数据库(详见WorkflowOwnershipException类)。

为了简化服务器创建,XAF附带了工作流服务器项目模板。请注意,在部署它之前,您必须拥有一个使用工作流模块的应用程序以及一个具有工作流特定表的数据库。要使用该模板,请在解决方案资源管理器中右键单击您的解决方案,然后选择添加|。新项目。选择DevExpress v 19.2 XAF解决方案向导模板,指定一个有意义的名称,然后按OK。在解决方案向导中选择Workflow Server Project,然后按Finish

Workflow_AddServerProject

这会将服务器项目添加到您的应用程序中。但是,必须先对其进行正确配置,然后才能对其进行部署。

基本配置

  1. 打开服务的App.config文件,并记下ConnectionString条目。该连接字符串指向包含服务工作流表以及可以为其执行工作流实例的业务类表的数据库。将此连接字符串替换为应用程序的数据库连接字符串。
  2. 打开包含System.ServiceProcess.ServiceBase后代声明的WorkflowServerService.csWorkflowServerService.vb)文件。在重写的OnStart方法中,将serverApplication.ApplicationName属性值更改为应用程序的XafApplication.ApplicationName,您在上一步中使用了该应用程序的连接字符串。
  3. 在调用serverApplication.Modules.BeginInit方法之后,将所需的模块添加到serverApplication.Modules集合中:

    public partial class MySolutionWorkflowService : System.ServiceProcess.ServiceBase {
        // ...
        protected override void OnStart(string[] args) {
            //...
            // The service can only manage workflows for those business classes that are contained in Modules specified by the serverApplication.Modules collection.
            // So, do not forget to add the required Modules to this collection via the serverApplication.Modules.Add method.
            serverApplication.Modules.BeginInit();
            serverApplication.Modules.Add(new SecurityModule());
            serverApplication.Modules.Add(new MySolutionModule());
            //...
        }
    }
    
    重点

    服务器应用程序应包括客户端应用程序中的所有模块(WinForms和ASP.NET)。否则,服务器将抛出CompatibilityException并无法启动。

  4. 定制时间段,以指定服务器服务检查数据库的频率。

    时期

    默认值

    描述

    StartWorkflowListenerService.DelayPeriod

    15秒

    指定服务器检查数据库中满足满足工作流程执行条件的对象的频率。

    StartWorkflowByRequestService.DelayPeriod

    15秒

    指定服务器多久检查一次数据库以查找应为其执行工作流实例的新创建的对象。

    RefreshWorkflowDefinitionsService.DelayPeriod

    15分钟

    指定从数据库重新加载工作流定义的频率。

    WorkflowInstanceStore.RunnableInstancesDetectionPeriod

    30秒

    指定检查数据库中应恢复的挂起工作流实例的频率。

    HostManager.CloseHostTimeout

    时间跨度零

    指定关闭打开的WorkflowServerHost对象所需的超时。当默认值设置为此属性时,将使用CommunicationObject.Close()方法。所述CommunicationObject.Close(时间跨度)当另一个值被分配使用方法。

    public partial class MySolutionWorkflowService : System.ServiceProcess.ServiceBase {
        // ...
        protected override void OnStart(string[] args) {
            //...
            server.StartWorkflowListenerService.DelayPeriod = TimeSpan.FromSeconds(15);
            server.StartWorkflowByRequestService.DelayPeriod = TimeSpan.FromSeconds(15);
            server.RefreshWorkflowDefinitionsService.DelayPeriod = TimeSpan.FromHours(1);
            server.HostManager.CloseHostTimeout = System.TimeSpan.FromSeconds(20);     
    
            server.CustomizeHost  = delegate(object sender, CustomizeHostEventArgs e) {
                e.WorkflowInstanceStoreBehavior.WorkflowInstanceStore.RunnableInstancesDetectionPeriod = 
                    TimeSpan.FromSeconds(15);
                };
            //...
        }
    }
    

    当前的Workflow Service实现不适用于工作流定义非常频繁(每分钟)更改并且应该在短时间内启动更新版本的情况。刷新操作是在HostManagerActivityProvider类的帮助下执行的,该类使用AssemblyBuilder类从XAML字符串创建活动。这种方法允许最终用户在工具箱中添加运行时活动,并将这些活动作为运行时工作流设计器中的组件重用。因此,通过每次刷新操作,都会创建一个新的程序集并将其加载到当前的AppDomain中。此操作需要额外的非托管内存(每个程序集大约100Kb)。当整个AppDomain都卸载时,所有已加载的程序集均被卸载对象已卸载。该HostManagerActivityProvider类不执行任何检查,并且总是创建一个新的组件。这就是使用的非托管内存不断增长的原因。为避免这种情况,请将RefreshWorkflowDefinitionsService.DelayPeriod周期设置为一小时,并在必要时手动强制执行刷新操作。您还可以调整服务的自动重启(请参阅自动重启Windows服务)。或者,您可以实现自定义HostManagerActivityProvider类,该类不需要额外的内存,但不允许重用运行时活动(请参阅如何:减少工作流服务的内存消耗)。

  5. 如果需要执行自定义的异常处理,请更改server.CustomHandleException委托声明。默认情况下,委托通过将e.Handled属性设置为false来记录异常并停止服务器。

    public partial class MySolutionWorkflowService : System.ServiceProcess.ServiceBase {
        // ...
        protected override void OnStart(string[] args) {
            //...
            server.CustomHandleException  = delegate(object sender, _
            DevExpress.ExpressApp.Workflow.ServiceModel.CustomHandleServiceExceptionEventArgs e) {
                Tracing.Tracer.LogError(e.Exception);
                e.Handled = false;
                };
            //...
        }
    }
    

部署工作流服务器

配置和构建服务之后,就可以部署它了。由于工作流服务器服务是常规的.NET服务,因此部署步骤与任何其他.NET服务相同。

  1. 运行Visual Studio命令提示符。服务安装需要提升的特权,因此您可能需要使用“以管理员身份运行”选项。
  2. 将当前目录更改为服务可执行文件路径,然后调用installutil myservice.exe命令,其中myservice.exe是服务可执行文件的名称。
  3. 在命令提示符下,调用services.msc命令以打开服务管理控制台。找到您的服务,然后通过右键单击它并选择Start来启动它。或者,您可以在注释提示中键入net start <service_name>。您可以在上一步中从installutil输出中复制服务名称,或者打开ProjectInstaller.csProjectInstaller.vb)文件并检查serviceInstaller.ServiceName值。
    重点

    运行服务之前,请确保数据库存在并已正确初始化。为此,请以“调试”模式运行一次客户端应用程序,或将其配置文件传递给DBUpdater工具(如“设置数据库连接”教程中所述)。

当您需要更新服务时,首先通过发出installutil myservice.exe / u命令来卸载以前的版本。然后使用上述步骤安装它。

调试工作流服务器

Workflow Server是常规Windows服务。若要了解如何对其进行调试,请参阅MSDN中的“如何:调试Windows服务应用程序”主题。如果无法通过net start命令启动该服务,请启动“事件查看器”应用程序并打开“应用程序”日志以查找问题所在。您还可以参考下面列出的MSDN主题。

相关文章

转载保留此链接,注明出处