Wexflow:C#中的开源工作流引擎

Wexflow是一个高性能,可扩展,模块化和跨平台的工作流引擎。Wexflow的目标是在没有用户干预的情况下自动执行重复任务。在Wexflow的帮助下,楼宇自动化和工作流程变得简单。Wexflow还有助于使长期运行的流程变得简单。

Wexflow旨在使系统,应用程序和人员之间的自动化,工作流程,长时间运行的流程和交互变得简单,直接和干净。通过这个功能强大的工作流引擎,系统或应用程序之间的通

Wexflow使用  .NET Core,这是一个跨平台版本的.NET,用于构建网站,服务和控制台应用程序。因此,Wexflow提供了一个跨平台的工作流服务器和跨平台后端,可轻松灵活地管理,设计和跟踪工作流。Wexflow服务器及其后端运行在Windows,Linux和macOS上。

Wexflow还利用  Quartz.NET  开源作业调度系统,该系统用于大型企业系统。因此,Wexflow在规划工作流作业(如cron工作流)时提供了可靠性  

此外,Wexflow 在其服务器和后端中使用LiteDB NoSQL文档存储数据库,这增强并改善了此工作流引擎的性能。

特征

Wexflow提供以下功能:

Wexflow也带有后端,因此您可以在所有工作流程中进行搜索和过滤,拥有工作流程的实时统计数据,轻松管理工作流程,轻松设计工作流程,并轻松跟踪工作流程:

只是为了让您了解Wexflow的功能,这是“Designer”页面的截图。使用“Designer”页面,我们可以获得工作流的依赖关系图的良好视觉概览。每个节点代表一个必须运行的任务:

  

找到更多的功能  细节

例子

以下是使用Wexflow的一些示例:

优点

以下是使用Wexflow的好处:

如何安装Wexflow?

Wexflow易于安装,需要轻松配置。它可以在几秒钟内安装和配置。

本节介绍如何在Windows系统上安装.NET版本的Wexflow,以及如何在Windows系统,Linux系统或macOS系统上安装.NET Core版本的Wexflow。

Windows(.NET)

Wexflow可以安装在Windows XP,Windows Server 2003或更高版本上。Wexflow支持.NET Framework 4.0或更高版本。

要安装Wexflow,请执行以下操作:

1.安装Microsoft .NET Framework 4.0或更高版本。

2.安装Wexflow:

3.选择目标位置:

4.您可以选择创建桌面快捷方式:

5.单击“安装”以执行安装:

6.安装程序将在系统上安装Wexflow:

7.最后,单击完成以完成安装:

8.  如果要使用同步任务,请安装Microsoft Sync Framework 2.1 Redistributables

     8.1如果您使用的是Wexflow x86,则同步-v2.1-x86-ENU.msi和ProviderServices-v2.1-x86-ENU.msi。

     8.2如果使用Wexflow x64,则同步-v2.1-x64-ENU.msi和ProviderServices-v2.1-x64-ENU.msi。

开始菜单中添加了以下菜单:

安装Wexflow后,将安装名为Wexflow的Windows服务并自动启动。要启动Wexflow Manager,必须运行此Windows服务。但是,如果要停止它,可以从Windows服务控制台执行此操作:

Windows(.NET核心)

  1. 下载并安装  .NET Core运行时

  2. 在系统上的某个位置下载并解压缩.NET Core软件包。

  3. 双击“install.bat”以安装Wexflow的配置文件。

  4. 而已。双击“run.bat”启动Wexflow工作流服务器:

端口8000必须是免费的。如果您已经在使用.NET版本的Wexflow,则必须停止Wexflow Windows服务或更改.NET Core版本的端口。

要更改.NET Core版本的端口,请编辑文件Wexflow.Server \ appsettings.json并更改设置“WexflowServicePort”的值。然后,通过编辑配置文件Backend \ _js \ settings.js来更改后端中的端口。

最后,您可以通过在浏览器上打开Backend \ index.html网页来打开后端。

要打开后端,请转到“后端”文件夹,然后双击文件“index.html”:

如果您是第一次安装Wexflow,则可以使用这些凭据登录:

用户名:admin

密码:wexflow2018

然后,您可以从后端更改密码。

Linux的

  1. 下载并安装  .NET Core运行时

  2. 在/ opt /中下载并解压缩.NET Core包。

  3. 打开终端并键入以下命令:

隐藏   复制代码

cd /opt/wexflow/Wexflow.Server
sudo dotnet Wexflow.Server.dll

就是这样,Wexflow已安装并准备工作:

最后,您可以通过在浏览器上打开网页/opt/wexflow/Backend/index.html来打开后端:

如果您是第一次安装Wexflow,则可以使用这些凭据登录:

用户名:admin

密码:wexflow2018

然后,您可以从后端更改密码。

如果要使用图像处理任务,则必须安装以下库:

隐藏   复制代码

sudo apt install libc6-dev libgdiplus

苹果系统

  1. 下载并安装  .NET Core运行时

  2. 在/ Applications /中下载并解压缩.NET Core包。

  3. 打开终端并键入以下命令:

隐藏   复制代码

cd /Applications/wexflow/Wexflow.Server
dotnet Wexflow.Server.dll

就是这样,Wexflow已经安装并准备好工作了。

最后,您可以通过在浏览器上打开网页/Applications/wexflow/Backend/index.html来打开后端:

如果您是第一次安装Wexflow,则可以使用这些凭据登录:

用户名:admin

密码:wexflow2018

然后,您可以从后端更改密码。

Android的

安装Wexflow服务器后,按照以下步骤在Android设备上安装Wexflow Manager:

1.下载wexflow.apk

2.安装wexflow.apk

3.启动Wexflow应用程序并通过设置菜单打开应用程序设置:

 

5.单击“Wexflow Web服务URI”:

6.配置Wexflow Web服务Uri:

确保Wexflow服务器正在运行,并且防火墙中的端口8000已打开。

就是这样,Wexflow应用程序已准备就绪。如果您是第一次安装Wexflow,则可以使用这些凭据登录:

用户名:admin

密码:wexflow2018

您可以从后端更改密码。

登录后,您将获得可以从Android设备轻松管理的工作流程列表:

如何卸载Wexflow?

视窗

要卸载Wexflow,只需单击“Windows开始菜单> Wexflow”中的“卸载”菜单。

或者转到“配置面板>添加/删除程序”,然后选择“Wexflow”并单击卸载:

卸载Wexflow后,将显示一个窗口,通知卸载成功:

之后Wexflow卸载,文件夹C:\Wexflow\ C:\WexflowTesting\不会被删除,以防止用户定义的工作流和测试场景被删除。但是,如果您不需要它们,可以手动删除它们。

日志文件  C:\Program Files\Wexflow\Wexflow.log 也不会被删除,以跟踪Wexflow完成的上一次操作。但是,如果您不需要日志,则可以删除日志文件。

Linux的

要从Linux系统卸载Wexflow,请执行以下操作:

隐藏   复制代码

sudo rm -rf /opt/wexflow

苹果系统

要从macOS系统卸载Wexflow,只需从/ Applications /文件夹中删除wexflow即可。

Android的

要从Android设备卸载Wexflow,只需打开设置>应用程序> Wexflow,然后将其卸载即可。

如何使用Wexflow?

一般

安装Wexflow后,将创建文件夹C:\ Wexflow \和C:\ WexflowTesting \。文件夹C:\ Wexflow \是Wexflow的主要配置文件夹,包含以下元素:

文件夹C:\ WexflowTesting \包含测试方案的数据。

日志用C:\ Program Files \ Wexflow \ Wexflow.log编写。每天有一个日志文件。旧的日志文件以此格式保存Wexflow.logyyyyMMdd。

在.NET Core版本中:

在工作流的配置文件下面:

隐藏   收缩    复制代码

<!--    This is the configuration file of a workflow. 
    A workflow is composed of:
      - An id which is an integer that must be unique.
      - A name which is a string that must be unique.
      - A description which is a string.
      - A Settings section which is composed of the following elements:
        - A launchType which is one of the following options:
          - startup: The workflow is launched when Wexflow Engine starts.
          - trigger: The workflow is launched manually from Wexflow Manager.
          - periodic: The workflow is launched periodically.
          - corn: The workflow is launched depending on a cron expression.
        - A period which is necessary for the periodic launchType. It is 
          a timeSpan in this format dd.hh:mm:ss. For example the period
          00.00:02:00 will launch the workflow every 2 minutes.
        - A cron expression which is necessary for the cron launchType.
          For example '0 0/2 * * * ?' will launch the workflow every 2 minutes.
        - The enabled option which allows to enable or disable a workflow.
          The possible values are true or false.
      - A LocalVariables section which contains local variables.
      - A Tasks section which contains the tasks that will be executed by
        the workflow one after the other.
        - A Task is composed of:
          - An id which is an integer that must be unique.
          - A name which is one of the options described in the tasks documentation.
          - A description which is a string.
          - The enabled option which allows to enable or disable a task. The possible 
            values are true or false.
          - A collection of settings.
      - An ExecutionGraph section which contains the execution graph of the workflow.--><Workflow xmlns="urn:wexflow-schema" id="$int" name="$string" description="$string">  <Settings>    <Setting name="launchType" value="startup|trigger|periodic|cron" />    <Setting name="period" value="dd.hh:mm:ss" />    <Setting name="cronExpression" value="$string" />    <Setting name="enabled" value="true|false" />  </Settings>  <LocalVariables>    <Variable name="$string" value="$string" />    <Variable name="$string" value="$string" />    <!-- You can add as many variables as you want. -->  </LocalVariables>  <Tasks>    <Task id="$int" name="$string" description="$string" enabled="true|false">      <Setting name="$string" value="$string" />      <Setting name="$string" value="$string" />      <!-- You can add as many settings as you want. -->    </Task>    <Task id="$int" name="$string" description="$string" enabled="true|false">      <Setting name="$string" value="$string" />      <Setting name="$string" value="$string" />    </Task>    <!-- You can add as many tasks as you want. -->  </Tasks>  <!-- This section is optional and described in the samples section. -->  <ExecutionGraph /></Workflow>

有关cron工作流程,请阅读以下  文档  以获取更多详细信息。

这里解释局部变量  

这里解释全局变量  

a的name选项Task必须是以下之一

执行图在示例部分中说明

要了解如何制作自己的工作流程,您可以查看可用的工作流程示例  C:\Wexflow\Workflows\ 并阅读任务文档

如果在创建新工作流程C:\Wexflow\Workflows\或删除或修改现有工作流程时,您不必重新启动Wexflow Windows服务,以使这些修改生效。Wexflow引擎将自动检测更改并重新加载,添加或删除工作流。

要禁用工作流,您可以将工作流的enabled设置选项设置为false如果要使工作流从Wexflow引擎加载的工作流列表中消失,则可以创建一个名为disabledwithin 的目录,  C:\Wexflow\Workflows\ 并将该工作流移动到该目录。

任务如何相互通信?

状态通过selectFiles和selectEntities设置在任务之间传输。

这可以通过以下方式工作:

  1. 工作流中的任务完成其工作并生成存储在集合中的文件。

  2. 另一项任务(必须在同一工作流程中)之后可以使用selectFiles XML属性引用这些文件,指定生成所需文件的任务的ID。然后它可以使用这些文件来完成自己的工作。

更直观(来自示例):

隐藏   复制代码

<Workflow xmlns="urn:wexflow-schema" id="1" name="Workflow_Invoices" description="Workflow_Invoices">
    <Settings>
        <Setting name="launchType" value="trigger" />
        <Setting name="enabled" value="true" />
    </Settings>
    <Tasks>
        <Task id="1" name="FilesLoader" description="Loading invoices" enabled="true">
            <Setting name="folder" value="C:\WexflowTesting\Invoices\" />
        </Task>
        <!-- some more tasks here -->
        <Task id="6" name="FilesMover" description="Moving invoices" enabled="true">
            <Setting name="selectFiles" value="1" />
            <Setting name="destFolder" value="C:\WexflowTesting\Invoices_sent\" />
        </Task>
    </Tasks></Workflow>

selectEntities设置与selectFiles的工作方式相同。唯一的区别是selectEntities旨在用于处理来自数据库或Web服务的自定义对象的任务。要进一步了解,请阅读   有关实体的文档

Wexflow经理

当您第一次打开Wexflow Manager时,您将看到以下窗口:

以下是登录凭据:

登录后,您将看到此窗口:

然后,您可以从后端更改密码。

使用Wexflow Manager,您可以轻松管理工作流程。Wexflow Manager是一个简单的应用程序,允许用户执行以下操作:

要查看Wexflow中发生了什么,请在Notepad ++C:\Program Files\Wexflow\Wexflow.log等文本编辑器中打开日志文件  Notepad ++将在填满时更新日志文件。

后端

后端是一个可以托管在IIS,Apache,Nginx或任何其他Web服务器上的网站。后端也可以在本地运行。

后端提供有关工作流程的实时统计信息。它可以让您轻松灵活地管理,设计和跟踪您的工作流程。您可以使用后端轻松访问,配置,管理,管理和开发工作流程。

登录

当您第一次打开后端时,您将到达登录页面:

以下是登录凭据:

登录后,您可以从“用户”页面更改密码。

重设密码

如果用户忘记了密码,可以点击“忘记密码?” 链接重置密码:

当用户点击“提交”按钮时,会向他发送一封电子邮件,其中包含一个临时密码,登录后他可以更改密码。

要允许后端发送电子邮件,必须在配置文件中设置SMPT配置:C:\ Program Files \ Wexflow \ Wexflow.Server.exe.config:

隐藏   复制代码

<?xml version="1.0" encoding="utf-8"?><configuration>  <configSections>    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  </configSections>  <appSettings>    <add key="WexflowSettingsFile" value="C:\Wexflow\Wexflow.xml"/>    <add key="Smtp.Host" value="smtp.gmail.com"/>    <add key="Smtp.Port" value="587"/>    <add key="Smtp.EnableSsl" value="true"/>    <add key="Smtp.User" value="user"/>    <add key="Smtp.Password" value="password"/>    <add key="Smtp.From" value="user"/>  </appSettings>  ...
 </configuration>

在.NET Core版本中,要在Windows系统中编辑的配置文件是Wexflow.Server \ appsettings.json:

隐藏   复制代码

{
  "WexflowSettingsFile": "C:\\Wexflow-dotnet-core\\Wexflow.xml",
  "WexflowServicePort":  8000, 
  "Smtp.Host": "smtp.gmail.com",
  "Smtp.Port": 587,
  "Smtp.EnableSsl": true,
  "Smtp.User": "user",
  "Smtp.Password": "password",
  "Smtp.From": "user",
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"    }
  }
}

在Linux系统中,要编辑的配置文件是/opt/wexflow/Wexflow.Server/appsettings.json:

隐藏   复制代码

{
  "WexflowSettingsFile": "/opt/wexflow/Wexflow/Wexflow.xml",
  "WexflowServicePort":  8000, 
  "Smtp.Host": "smtp.gmail.com",
  "Smtp.Port": 587,
  "Smtp.EnableSsl": true,
  "Smtp.User": "user",
  "Smtp.Password": "password",
  "Smtp.From": "user",
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"    }
  }
}

在macOS系统中,要编辑的配置文件是/Applications/wexflow/Wexflow.Server/appsettings.json:

隐藏   复制代码

{
  "WexflowSettingsFile": "/Applications/wexflow/Wexflow/Wexflow.xml",
  "WexflowServicePort":  8000, 
  "Smtp.Host": "smtp.gmail.com",
  "Smtp.Port": 587,
  "Smtp.EnableSsl": true,
  "Smtp.User": "user",
  "Smtp.Password": "password",
  "Smtp.From": "user",
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"    }
  }
}

仪表板

登录后,您将到达仪表板页面:

Wexflow为您提供了一个漂亮的仪表板,可以查看工作流程的实时统计信息。实际上,“仪表板”页面为您提供有关工作流程的实时统计信息,并可让您轻松,详细地跟踪工作流程服务器。在仪表板中,您还可以按关键字或按日期过滤工作流条目。您还可以按日期,按名称等订购工作流条目。

经理

“经理”页面可让您轻松管理工作流程。实际上,您可以从此页面启动工作流,暂停正在运行的工作流,恢复已暂停的工作流,停止正在运行的工作流并按关键字搜索工作流:

设计师

“Designer”页面可让您轻松设计工作流程。实际上,您可以从此页面创建新工作流程,编辑现有工作流程或删除工作流程。此页面还允许您可视化工作流的依赖关系图。使用“Designer”页面,我们可以获得工作流的依赖关系图的良好视觉概览。每个节点代表一个必须运行的任务:

历史

“历史记录”页面将允许您跟踪工作流服务器上发生的所有工作流程和所有内容。实际上,您可以从此页面概览在工作流服务器上执行的所有工作流实例。此外,您可以按关键字或日期过滤条目。您还可以按日期,名称等订购参赛作品。

用户

“用户”页面允许创建新用户,更改密码和用户信息,以及删除具有受限访问权限的用户。

具有受限权限的用户只能访问“仪表板”页面和“历史记录”页面。当他登录时,他将对后端有如下看法:

安装

后端是一个可以托管在IIS,Apache,Nginx或任何其他Web服务器上的网站。后端也可以在本地运行。

要在Web服务器上安装后端,只需在Web服务器中复制文件夹“C:\ Program Files \ Wexflow \ Backend”的内容即可。然后,如果要在另一台计算机上安装后端,请配置工作流服务器URI。只需编辑配置文件“js / settings.js”:

隐藏   复制代码

Settings = {
    Uri: "http://localhost:8000/wexflow/"};

而不是localhost,将机器的IP或DNS放在安装了Wexflow服务器的位置。

Android Manager

Wexflow提供了一个用于管理工作流程的Android应用程序。

Wexflow Android Manager允许用户执行以下操作:

工作流样本

Wexflow旨在为工作流程和自动化领域的初学者提供简单易用的方法。

可以通过设计人员  或通过编辑工作流程的配置文件进行XML编辑来设计  工作流程。但是,强烈建议您了解Wexflow工作流语法,以熟悉此工作流引擎。

Wexflow中的每个工作流都有一个 默认位于文件夹C:\ Wexflow \ Workflows中的  配置文件每个配置文件都包含一组要执行的设置和任务,具体取决于指定的计划和指定的配置。

在本节中,将介绍几个工作流程示例,以使最终用户熟悉Wexflow工作流程语法。

顺序工作流程

顺序工作流按顺序逐个执行一组任务。任务以顺序方式执行,直到最后一个任务完成。可以通过修改工作流的执行图来更改任务执行的顺序。

工作流程1

此工作流将发票上载到SFTP服务器,然后等待2天,然后通知客户。

隐藏   收缩    复制代码

<Workflow xmlns="urn:wexflow-schema" id="1" name="Workflow_Invoices" description="Workflow_Invoices">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading invioces" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\Invoices\" />        </Task>        <Task id="2" name="Ftp" description="Uploading invoices" enabled="true">            <Setting name="protocol" value="sftp" /> <!-- ftp|ftps|sftp -->            <Setting name="command" value="upload" /> <!-- list|upload|download|delete -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="Wait" description="Waiting for 2 days" enabled="true">            <Setting name="duration" value="2.00:00:00" />        </Task>        <Task id="4" name="FilesLoader" description="Loading emails" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Invoices.xml" />        </Task>
       <Task id="5" name="MailsSender" description="Notifying customers" enabled="true">            <Setting name="selectFiles" value="4" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="6" name="FilesMover" description="Moving invoices" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Invoices_sent\" />        </Task>    </Tasks></Workflow>

首先,FilesLoader任务加载位于文件夹中的所有发票  C:\WexflowTesting\Invoices\,然后Ftp任务将它们上传到SFTP服务器,然后Wait任务等待2天,然后FilesLoader任务以XML格式加载电子邮件,然后MailsSender任务发送电子邮件。最后,FilesMover任务将发票移动到文件夹  C:\WexflowTesting\Invoices_sent\

工作流程2

此工作流等待文件到达C:\WexflowTesting\Watchfolder1\ ,  C:\WexflowTesting\Watchfolder2\然后将它们上载到FTP服务器,然后将它们移动到C:\WexflowTesting\Sent\文件夹。此工作流程每2分钟开始一次。

隐藏   复制代码

<Workflow xmlns="urn:wexflow-schema" id="2" name="Workflow_FilesSender" description="Workflow_FilesSender">    <Settings>        <Setting name="launchType" value="periodic" />        <Setting name="period" value="00.00:02:00.00" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\Watchfolder1\" />            <Setting name="folder" value="C:\WexflowTesting\Watchfolder2\" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->            <Setting name="command" value="upload" /> <!-- list|upload|download|delete -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesMover" description="Moving files to Sent folder" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Sent\" />        </Task>    </Tasks></Workflow>

首先,该FilesLoader任务加载位于文件夹中的所有文件  C:\WexflowTesting\Watchfolder1\ ,  C:\WexflowTesting\Watchfolder2\然后该Ftp任务加载文件并将它们上载到FTP服务器。最后,该FilesMover任务将文件移动到该文件夹  C:\WexflowTesting\Sent\

工作流程3

此工作流程C:\WexflowTesting\WAV\通过FFMPEG将位于MP3格式的WAV文件转码,并将转码后的文件移动到  C:\WexflowTesting\MP3\

隐藏   复制代码

<Workflow xmlns="urn:wexflow-schema" id="3" name="Workflow_ffmpeg" description="Workflow_ffmpeg">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading WAV files" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\WAV\" />        </Task>        <Task id="2" name="ProcessLauncher" description="WAV to MP3" enabled="true">            <Setting name="selectFiles" value="1" />
            <!-- You need to install FFMPEG -->            <Setting name="processPath" value="C:\Program Files\ffmpeg\bin\ffmpeg.exe" />            <!-- variables: {$filePath},{$fileName},{$fileNameWithoutExtension}-->            <Setting name="processCmd" value="-i {$filePath} -codec:a libmp3lame -qscale:a 2 {$output:$fileNameWithoutExtension.mp3}" /> 
            <Setting name="hideGui" value="true" />            <Setting name="generatesFiles" value="true" /> 
        </Task>        <Task id="3" name="FilesMover" description="Moving MP3 files from temp folder" enabled="true">            <Setting name="selectFiles" value="2" />            <Setting name="destFolder" value="C:\WexflowTesting\MP3\" />        </Task>    </Tasks></Workflow>

首先,该FilesLoader任务加载位于该文件夹中的所有文件,  C:\WexflowTesting\WAV\ 然后该  ProcessLauncher 任务通过指定正确的命令来为每个文件启动FFMPEG进程以创建MP3文件。最后,该FilesMover任务将MP3文件移动到该文件夹  C:\WexflowTesting\MP3\

工作流程4

此工作流等待WAV文件到达,C:\WexflowTesting\WAV\然后通过VLC将它们转码为MP3文件,然后将MP3文件上传到FTP服务器,然后将WAV文件移动到  C:\WexflowTesting\WAV_processed\此工作流程每2分钟开始一次。

隐藏   收缩    复制代码

<Workflow xmlns="urn:wexflow-schema" id="4" name="Workflow_vlc" description="Workflow_vlc">    <Settings>        <Setting name="launchType" value="periodic" />        <Setting name="period" value="00.00:02:00.00" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading WAV files" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\WAV\" />        </Task>        <Task id="2" name="ProcessLauncher" description="WAV to MP3" enabled="true">            <Setting name="selectFiles" value="1" />            <!-- You need to install VLC-->            <Setting name="processPath" value="C:\Program Files\VideoLAN\VLC\vlc.exe" />            <!-- variables: {$filePath},{$fileName},{$fileNameWithoutExtension}-->            <Setting name="processCmd" value="-I dummy {$filePath} :sout=#transcode{acodec=mpga}:std{dst={$output:$fileNameWithoutExtension.mp3},access=file} vlc://quit" />            <Setting name="hideGui" value="true" />            <Setting name="generatesFiles" value="true" />        </Task>        <Task id="3" name="Ftp" description="Uploading MP3 files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="2" />        </Task>        <Task id="4" name="FilesMover" description="Moving WAV files" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\WAV_processed\" />        </Task>    </Tasks></Workflow>

首先,FilesLoader任务加载位于文件夹中的所有文件,  C:\WexflowTesting\WAV\ 然后  ProcessLauncher 任务通过指定正确的命令来启动每个文件的VLC过程以创建MP3文件。然后,该Ftp任务加载任务生成的MP3文件  ProcessLauncher ,然后将其上载到FTP服务器。最后,该FilesMover任务将处理后的WAV文件移动到该文件夹  C:\WexflowTesting\WAV_processed\

工作流程5

此工作流程从FTP服务器下载特定文件。此工作流程首先列出位于服务器根文件夹中的所有文件,然后通过XSLT(LisFiles.xslt标记要下载的特定文件,然后通过Ftp任务  todo="toDownload" 和from="app4"标签下载文件,然后下载的文件为移动到文件夹C:\WexflowTesting\Ftp_download\

Hide   Shrink    Copy Code

<Workflow xmlns="urn:wexflow-schema" id="5" name="Workflow_Ftp_download_tag" description="Workflow_Ftp_download_tag">    <Settings>        <Setting name="launchType" value="trigger" /> <!-- startup|trigger|periodic -->        <Setting name="enabled" value="true" /> <!-- true|false -->    </Settings>    <Tasks>        <Task id="1" name="Ftp" description="Listing files (FTP)" enabled="true">            <Setting name="command" value="list" />            <Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />        </Task>        <Task id="2" name="ListFiles" description="Listing files" enabled="true">        </Task>        <Task id="3" name="Xslt" description="Renaming and tagging files" enabled="true">            <Setting name="selectFiles" value="2" />            <Setting name="xsltPath" value="C:\Wexflow\Xslt\ListFiles.xslt" />            <Setting name="version" value="2.0" /> <!-- 1.0|2.0 -->            <Setting name="removeWexflowProcessingNodes" value="false" />        </Task>        <Task id="4" name="Ftp" description="Downloading files" enabled="true">            <Setting name="command" value="download" />            <Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" todo="toDownload" from="app4" />        </Task>        <Task id="5" name="FilesMover" description="Moving files to Ftp_download" enabled="true">            <Setting name="selectFiles" value="4" />            <Setting name="destFolder" value="C:\WexflowTesting\Ftp_download\" />            <Setting name="overwrite" value="true" />        </Task>    </Tasks></Workflow>

Roughly speaking, the Ftp task loads the list of files located at the root folder of the FTP server in the running instance of the workflow, then the ListFiles task outputs and XML file that contains all the files loaded then the Xslt task takes as input this XML and generates an XML which contains a system node called <WexflowProcessing> which contains the list of files to be tagged and/or renamed.

To understand how tagging and renaming files work, refer to the documentation of the ListFiles and Xslt tasks.

Below is the XSLT ListFiles.xslt used for tagging files:

Hide   Shrink    Copy Code

<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:output method="xml" indent="yes"/>  <xsl:template match="/">    <root>      <WexflowProcessing>        <xsl:for-each select="//WexflowProcessing/Workflow/Files//File">          <xsl:choose>            <xsl:when test="@name = 'file1.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file1_renamed.txt" todo="toRename" from="app1" />            </xsl:when>            <xsl:when test="@name = 'file2.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file2_renamed.txt" todo="toSend" from="app2" />            </xsl:when>            <xsl:when test="@name = 'file3.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file3_renamed.txt" todo="toDownload" from="app3" />            </xsl:when>            <xsl:when test="@name = 'file4.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file4_renamed.txt" todo="toDownload" from="app4" />            </xsl:when>          </xsl:choose>        </xsl:for-each>      </WexflowProcessing>    </root>  </xsl:template></xsl:stylesheet>

Execution graph

This workflow loads the file C:\WexflowTesting\file1.txt then uploads it to an FTP server then moves it to C:\WexflowTesting\Sent\ folder.

Hide   Shrink    Copy Code

<Workflow xmlns="urn:wexflow-schema" id="6" name="Workflow_Ftp_upload" description="Workflow_Ftp_upload">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesMover" description="Moving files to Sent folder" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Sent\" />        </Task>    </Tasks>    <ExecutionGraph>      <Task id="1"><Parent id="-1" /></Task>      <Task id="2"><Parent id="1"  /></Task>      <Task id="3"><Parent id="2"  /></Task>    </ExecutionGraph></Workflow>

首先,FilesLoader任务加载文件,  C:\WexflowTesting\file1.txt 然后Ftp任务加载该文件并将其上载到FTP服务器。最后,FilesMover任务将该文件移动到该文件夹  C:\WexflowTesting\Sent\

按照惯例,要执行的第一个任务的父任务ID必须始终为-1。此工作流的执行图将按以下顺序执行任务:

但是,如果执行图修改如下:

隐藏   复制代码

<ExecutionGraph>  <Task id="1"><Parent id="-1" /></Task>  <Task id="3"><Parent id="1"  /></Task>  <Task id="2"><Parent id="3"  /></Task></ExecutionGraph>

任务将按如下方式执行:

如果执行图修改如下:

隐藏   复制代码

<ExecutionGraph>  <Task id="3"><Parent id="-1" /></Task>  <Task id="2"><Parent id="3"  /></Task>  <Task id="1"><Parent id="2"  /></Task></ExecutionGraph>

任务将按如下方式执行:

执行图中禁止两件事:

  1. 无限循环。

  2. 并行任务。

这是一个无限循环的例子:

隐藏   复制代码

<ExecutionGraph>  <Task id="1"><Parent id="-1" /></Task>  <Task id="2"><Parent id="1"  /></Task>  <Task id="1"><Parent id="2"  /></Task></ExecutionGraph>

以下是并行任务的示例:

隐藏   复制代码

<ExecutionGraph>  <Task id="1"><Parent id="-1" /></Task>  <Task id="2"><Parent id="1"  /></Task>  <Task id="3"><Parent id="1"  /></Task></ExecutionGraph>

流程图工作流程

流程图工作流是在其执行图中包含至少一个流程图节点(If / While / Switch)的工作流。流程图节点将流程图任务和一组任务逐个按顺序执行作为输入。可以通过修改流程图节点的执行图来改变任务执行的顺序。

如果

以下工作流是由文件file.trigger触发的流程图工作流。如果在文件系统上找到文件file.trigger,则此工作流将文件file1.txt上载到FTP服务器,然后它将通知客户上载成功。否则,如果在文件系统上找不到触发器file.trigger,则工作流将通知客户上载失败。

隐藏   收缩    复制代码

<Workflow xmlns="urn:wexflow-schema" id="7" name="Workflow_If" description="Workflow_If">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesLoader" description="Loading emails (OK)" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="4" name="MailsSender" description="Notifying customers (OK)" enabled="true">            <Setting name="selectFiles" value="3" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="5" name="FilesLoader" description="Loading emails (KO)" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="6" name="MailsSender" description="Notifying customers (KO)" enabled="true">            <Setting name="selectFiles" value="5" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="99" name="FileExists" description="Checking trigger file" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file.trigger" />        </Task>    </Tasks>    <ExecutionGraph>      <If id="100" parent="-1" if="99">         <Do>            <Task id="1"><Parent id="-1" /></Task>            <Task id="2"><Parent id="1"  /></Task>            <Task id="3"><Parent id="2"  /></Task>            <Task id="4"><Parent id="3"  /></Task>         </Do>         <Else>            <Task id="5"><Parent id="-1" /></Task>            <Task id="6"><Parent id="5"  /></Task>         </Else>      </If>    </ExecutionGraph></Workflow>

按照惯例,要执行的第一个任务的父任务ID <Do><Else>节点必须始终为-1。

您可以If在执行图中的任何位置添加流程图节点。此外,您可以根据需要添加。您也可以将它们添加事件节点OnSuccessOnWarningOnError

一个If可以在a If,a While和a中Switch

此工作流由文件file.trigger触发。当文件file.trigger存在时,此工作流程将文件file1.txt上传到FTP服务器然后它将通知客户然后它将等待2天然后它将再次启动。

隐藏   收缩    复制代码

<Workflow xmlns="urn:wexflow-schema" id="8" name="Workflow_While" description="Workflow_While">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesLoader" description="Loading emails" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="4" name="MailsSender" description="Notifying customers" enabled="true">            <Setting name="selectFiles" value="3" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="5" name="Wait" description="Waiting for 2 days..." enabled="true">            <Setting name="duration" value="02.00:00:00" />        </Task>        <Task id="99" name="FileExists" description="Checking trigger file" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file.trigger" />        </Task>    </Tasks>    <ExecutionGraph>      <While id="100" parent="-1" while="99">        <Task id="1"><Parent id="-1" /></Task>        <Task id="2"><Parent id="1"  /></Task>        <Task id="3"><Parent id="2"  /></Task>        <Task id="4"><Parent id="3"  /></Task>        <Task id="5"><Parent id="4"  /></Task>      </While>    </ExecutionGraph></Workflow>

按照惯例,要在<While>节点中执行的第一个任务的父任务ID  必须始终为-1。

You can add While flowchart nodes pretty much wherever you want in the execution graph. Also, you can add as mush as you want. You can also add them in the event nodes OnSuccessOnWarning and OnError.

While can be inside a While, an If and a Switch.

Switch

This workflow starts every 24 hours. On Monday, it uploads files to an FTP server and on Wednesday it notifies customers.

Hide   Shrink    Copy Code

<Workflow xmlns="urn:wexflow-schema" id="43" name="Workflow_Switch" description="Workflow_Switch">
  <Settings>
    <Setting name="launchType" value="periodic" />
	<Setting name="period" value="1.00:00:00" />
    <Setting name="enabled" value="true" />
  </Settings>
  <Tasks>
    <Task id="1" name="Now" description="Getting current day" enabled="true">
      <Setting name="culture" value="en-US" />  
      <Setting name="format" value="dddd" />
    </Task>
	<Task id="2" name="FilesLoader" description="Loading files" enabled="true">
      <Setting name="file" value="C:\WexflowTesting\file1.txt" />
    </Task>
    <Task id="3" name="Ftp" description="Uploading files" enabled="true">
      <Setting name="protocol" value="ftp" />
      <Setting name="command" value="upload" />
      <Setting name="server" value="127.0.1" />
      <Setting name="port" value="21" />
      <Setting name="user" value="user" />
      <Setting name="password" value="password" />
      <Setting name="path" value="/" />
      <Setting name="selectFiles" value="1" />
    </Task>
   <Task id="4" name="FilesLoader" description="Loading emails" enabled="true">
      <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
   </Task>
   <Task id="5" name="MailsSender" description="Notifying customers" enabled="true">
        <Setting name="selectFiles" value="3" />
        <Setting name="host" value="127.0.0.1" />
        <Setting name="port" value="587" />
        <Setting name="enableSsl" value="true" />
        <Setting name="user" value="user" />
        <Setting name="password" value="password" />
    </Task>
  </Tasks>
  <ExecutionGraph>
    <Switch id="100" parent="-1" switch="1">
      <Case value="Monday">
        <Task id="2"><Parent id="-1" /></Task>
		<Task id="3"><Parent id="2" /></Task>
      </Case>
      <Case value="Wednesday">
        <Task id="4"><Parent id="-1" /></Task>
        <Task id="5"><Parent id="4" /></Task>
      </Case>
      <Default />
    </Switch>
  </ExecutionGraph></Workflow>

By convention, the parent task id of the first task to be executed in the Case/Default nodes must always be -1.

You can add Switch flowchart nodes pretty much wherever you want in the execution graph. Also, you can add as mush as you want. You can also add them in the event nodes OnSuccessOnWarning and OnError.

Switch can be inside a While, an If and a Switch.

Workflow events

工作流完成其工作后,其最终结果是成功,或警告或错误。如果其最终结果成功,则触发OnSuccess事件。如果其最终结果是警告,则会触发OnWarning事件。如果其最终结果是错误,则触发OnError事件。事件包含要按顺序逐个执行的一组任务和/或流程图节点。可以通过修改事件的执行图来改变任务和/或流程图节点的执行顺序。

此工作流将file1.txt上载到FTP服务器,然后在成功的情况下通知客户。

隐藏   收缩    复制代码

<Workflow xmlns="urn:wexflow-schema" id="9" name="Workflow_Events" description="Workflow_Events">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>       <Task id="3" name="FilesLoader" description="Loading emails" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="4" name="MailsSender" description="Notifying customers" enabled="true">            <Setting name="selectFiles" value="3" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>    </Tasks>    <ExecutionGraph>      <Task id="1"><Parent id="-1" /></Task>      <Task id="2"><Parent id="1"  /></Task>      <OnSuccess>        <Task id="3"><Parent id="-1" /></Task>        <Task id="4"><Parent id="3"  /></Task>      </OnSuccess>    </ExecutionGraph></Workflow>

流程图事件节点<OnWarning><OnError>可以以相同的方式使用。你可以把IfWhileSwitch在活动节点流程图节点。

这些是简单而基本的工作流程,可以让您了解如何制作自己的工作流程。但是,如果您在工作流程中涉及多个系统,应用程序和自动化,则工作流程可能非常有趣。

如何创建自定义任务?

一般

自定义任务是工作流引擎中的必需,并允许系统和应用程序进行交互。

例如,要创建自定义任务MyTask,您需要按以下步骤操作:

  1. 在Visual Studio中创建一个类库项目并命名它Wexflow.Tasks.MyTask

  2. Wexflow.Core.dll通过nuget包管理器引用及其依赖项:

隐藏   复制代码

PM> Install-Package Wexflow

     3.创建一个MyTask实现抽象类的公共类  Wexflow.Core.Task

Wexflow.Tasks.MyTask 代码应如下所示:

隐藏   复制代码

using System.Threading;using System.Xml.Linq;using Wexflow.Core;namespace Wexflow.Tasks.MyTask
{    public class MyTask : Task
    {        public MyTask(XElement xe, Workflow wf) : base(xe, wf)
        {            // Task settings goes here
        }        public override TaskStatus Run()
        {            try
            {                // Task logic goes here

                return new TaskStatus(Status.Success);
            }            catch (ThreadAbortException)
            {                throw;
            }
        }
    }
}

每个任务TaskStatus在完成执行其作业时返回一个对象。TaskStatus由以下元素组成:

隐藏   复制代码

public Status Status { get; set; }public bool Condition { get; set; }public string SwitchValue { get; set; }

Status可以是下列条件之一:

隐藏   复制代码

public enum Status
{
  Success,
  Warning,
  Error
}

例如,如果任务对文件集合执行操作,并且如果此操作对所有文件成功,那么它Status应该是Success否则,如果此操作对某些文件成功而对其他文件失败则Status应该是Warning否则,如果此操作对所有文件都失败,那么它Status应该是Error

Condition属性专为流程图任务而设计。除了Status任务之外,流程图任务在执行其操作之前truefalse之后返回

Condition应始终将该属性设置false为顺序任务。

SwitchValue被设计为由Switch流程图节点使用。如果在SwitchValue属性中设置值并在Switch流程图节点中使用此任务,则将执行与该值对应的大小写。否则,如果Default设置大小写,它将被执行。

您可以使用TaskStatus适合您需要构造函数。

要检索设置,您可以使用以下方法:

隐藏   复制代码

string settingValue = this.GetSetting("settingName");string settingValue = this.GetSetting("settingName", defaultValue);string[] settingValues = this.GetSettings("settingName");

要通过selectFiles设置选项选择正在运行的工作流实例加载的文件,您可以按如下方式执行此操作:

隐藏   复制代码

FileInf[] files = this.SelectFiles();

要通过selectEntities设置选项选择正在运行的工作流实例加载的实体,可以按如下方式执行:

隐藏   复制代码

Entity[] entities = this.SelectEntities();

Entity处理从数据库或Web服务操作对象的自定义任务时该类非常有用。

要在任务中加载文件,可以按如下方式执行:

隐藏   复制代码

this.Files.Add(new FileInf(path, this.Id));

要在任务中加载实体,可以按如下方式执行:

隐藏   复制代码

this.Entities.Add(myEntity);

最后,如果您完成了自定义任务的编码,请编译类库项目并将程序集Wexflow.Tasks.MyTask.dll复制到C:\ Program Files \ Wexflow \或C:\ Wexflow \ Tasks \中。可以通过tasksFolder配置文件C:\ Wexflow \ Wexflow.xml中的设置来配置文件夹C:\ Wexflow \ Tasks  \的路径。

然后,您可以按如下方式使用自定义任务:

隐藏   复制代码

<Task id="$int" name="MyTask" description="My task description" enabled="true">    <Setting name="settingName" value="settingValue" /></Task>

而已。这就是开始编写自己的自定义任务所需要知道的所有事情。

要测试自定义任务,请创建一个新工作流(新XML文件)并将自定义任务的配置放在其中,如下所示:

隐藏   复制代码

<Workflow xmlns="urn:wexflow-schema" id="99" name="Workflow_MyWorkflow" description="Workflow_MyWorkflow">
	<Settings>
		<Setting name="launchType" value="trigger" /> <!-- startup|trigger|periodic|cron -->
		<Setting name="enabled" value="true" /> <!-- true|false -->
	</Settings>
	<Tasks>
        <Task id="1" name="MyTask" description="My task description" enabled="true">
            <Setting name="settingName" value="settingValue" />
        </Task>
	</Tasks></Workflow>

然后,将该XML文件放在C:\ Wexflow \ Workflows \中。

然后,工作流将显示在Wexflow Manager的工作流列表中。然后你可以从那里启动它。

记录

Task类可以使用以下方法进行日志记录:

隐藏   复制代码

public void Info(string msg);public void InfoFormat(string msg, params object[] args);public void Debug(string msg);public void DebugFormat(string msg, params object[] args);public void Error(string msg);public void ErrorFormat(string msg, params object[] args);public void Error(string msg, Exception e);public void ErrorFormat(string msg, Exception e, params object[] args);

可以通过调用方法AddAddRange以下方法将文件加载到任务中

隐藏   复制代码

this.Files.Add(myFile);this.Files.AddRange(myFiles);

然后,可以通过其任务ID在其他任务中选择加载的文件,如下所示:

隐藏   复制代码

<Setting name="selectFiles" value="$taskId" />

要通过selectFiles设置选项选择正在运行的工作流实例加载的文件,您可以按如下方式执行此操作:

隐藏   复制代码

FileInf[] files = this.SelectFiles();

实体

实体是一个抽象类,具有任务的Id作为属性:

隐藏   复制代码

namespace Wexflow.Core
{    public abstract class Entity
    {        public int TaskId { get; set; }
    }
}

实体类被设计为由其他类继承,例如从数据库或Web服务或API或其他任何东西检索的对象。然后,可以通过调用方法AddAddRange以下方法将这些对象加载到任务中

隐藏   复制代码

this.Entities.Add(myEntity);this.Entities.AddRange(myEntities);

然后,可以通过其任务ID在其他任务中选择加载的实体,如下所示:

隐藏   复制代码

<Setting name="selectEntities" value="$taskId" />

实体旨在用于自定义任务。

要通过selectEntities设置选项选择正在运行的工作流实例加载的实体,可以按如下方式执行:

隐藏   复制代码

Entity[] entities = this.SelectEntities();

在处理从数据库或Web服务操作对象的自定义任务时,Entity类非常有用。

共享内存

任务包含一个Hashtable,可用作它们之间的共享内存。

要将对象添加到Hashtable,只需按以下步骤操作:

隐藏   复制代码

this.Hashtable.Add("myKey", myObject);

要从Hashtable中检索对象,只需按以下步骤操作:

隐藏   复制代码

var myObject = this.Hashtable["myKey"];

要从Hashtable中删除对象,只需按以下步骤操作:

隐藏   复制代码

this.Hashtable.Remove("myKey");

设计师

要使您的自定义任务MyTask出现在设计器的下拉列表中,只需打开文件C:\ Wexflow \ TasksNames.json并在其中添加“MyTask”,如下所示:

隐藏   复制代码

[
..."MyTask"]

您还必须通过打开文件C:\ Wexflow \ TasksSettings.json并添加自定义设置来添加设置,如下所示:

隐藏   复制代码

{
..."MyTask": ["settingName"]
}

而已。MyTask将显示在设计器下拉列表中,选中时它的设置也会显示出来。

调试

要调试自定义任务,可以使用  日志记录

您还可以克隆此Wexflow的存储库并在Visual Studio中打开Wexflow.vs2017.sln或Wexflow.vs2010.sln,并按照这些  指南  调试Wexflow服务器。然后,您可以在解决方案中创建自定义任务并进行调试。当然,要调试它,你必须按如下方式进行:

  1. 创建自定义任务。

  2. 在Wexflow.Server中引用您的自定义任务。

  3. 使用自定义任务创建工作流程(请参阅  文档)。

  4. 将工作流程放在C:\ Wexflow \ Workflows中。

  5. 打开Wexflow Manager或后端,从那里触发您的工作流程。

如何调试Wexflow?

要调试Wexflow,请执行以下操作:

而已。我希望你喜欢阅读这篇文章。如果您有任何改进Wexflow的想法,或者如果您遇到任何问题或想要为此项目做出贡献,请在评论或GitHub中告诉我。

Wexflow使用的库

以下是Wexflow使用的库列表:

历史


合作伙伴

网站备案:豫ICP备15023476号-1 唯特科技