BPMN 2.0使用简介

在这个简短的教程中,我将展示如何使用业务流程建模符号 (BPMN)构建业务应用程序。这种方法不同于通常的以数据为中心的方法,因为我们专注于流程管理而不是数据处理。

数据处理与流程管理
当我们按照传统方法构建以数据为中心的业务应用程序时,我们通常首先设计一个数据模式。数据模式定义可以管理哪种数据。该应用程序允许我们创建新的数据集、编辑现有数据,当然还可以搜索数据。

在以流程为中心的业务应用程序中,我们首先尝试回答如何处理数据,以便让每个参与者都能以最佳方式访问信息,从而实现特定的业务目标。在当今快速发展的商业环境中,这种问题变得越来越重要。BPMN 提供了一种完美的方法,可以从头到尾对工作流及其业务目标进行建模。可以使用各种工具创建 BPMN 模型,例如开源 BPMN 设计器Open-BPMN

BPMN 的一大优势在于它不仅让所有利益相关者清楚地了解流程,BPMN 2.0 模型还可以由合适的流程引擎执行。这种“低代码”或“模型驱动”方法带来了一种更灵活的业务应用程序实现方式。当然,数据仍然发挥着重要作用,工作流引擎允许我们以各种方式管理业务数据。那么让我们看看它是如何工作的……

从业务流程开始……
首先,我们必须考虑业务应用背后的业务流程。在考虑数据之前,我们应该关注以下问题:

  • 我们为什么需要这种信息?
  • 谁负责创建或更新数据?
  • 正确处理数据需要哪些步骤?
  • 我们期望接下来会发生什么?

如前所述,业务流程定义了实现具体业务目标的方式。在 BPMN 模型中,我们可以从头到尾描述这种方式。


BPMN 模型定义了:

  • 开始(绿色)和结束(红色)事件来标记流程的开始和结束。
  • 活动元素(蓝色框)定义业务流程中的单个任务。这也可以是一个要达到的里程碑。
  • 事件(蓝色圆圈)定义进入新任务或状态的转换。事件可以由外部触发(例如“收到客户的订单”)或由参与者触发(例如“创建提案并提交审核”)。

这样,我们就得到了一个序列流 - 工作流。

商业规则
除了顺序流之外,我们还可以定义业务规则来实现其他业务逻辑。例如,我们可以定义此示例流程中的审核仅适用于投标金额超过 1.000.00 欧元的提案。为此,我们可以向图表中添加具有条件流的专属网关:


在此示例中,“Gateway-1”和“Review Task”之间的转换(序列流)现在包含一个条件 - 例如:

workitem.getItemValueDouble('amount')>=1000.0

BPMN 引擎可以根据工作流中提供的数据,使用不同的脚本语言评估此类条件。数据可以直接存储在流程实例中,也可以通过对外部数据源的引用来定义。BPMN 2.0 标准中还定义了许多其他元素,允许对更复杂的业务流程进行建模。

运行您的业务流程...
现在让我们看看如何使用 BPMN 引擎在应用程序中启动和控制这样的 BPMN 流程。有各种可用的 BPMN 引擎,其中很多都是开源的。

请参阅Github 上由 @meirwah 维护的awesome-workflow-engines列表。


下面我使用支持 BPMN 2.0 的Imixs-Workflow引擎,它提供了一个 docker 容器,让我们可以立即开始使用,而无需编写任何代码。使用 Imixs -Microservice,我们可以在容器中启动 BPMN 工作流引擎。只需创建一个docker-compose.yaml包含以下内容的本地文件:

services:
  imixs-db:
    image: postgres:13.11
    environment:
      POSTGRES_PASSWORD: adminadmin
      POSTGRES_DB: workflow-db  
  imixs-app:
    image: imixs/imixs-microservice:latest
    environment:
      TZ: "CET" 
      LANG:
"en_US.UTF-8"  
      POSTGRES_USER:
"postgres"
      POSTGRES_PASSWORD:
"adminadmin"
      POSTGRES_CONNECTION:
"jdbc:postgresql://imixs-db/workflow-db"
    ports:
      -
"8080:8080"

…然后使用以下命令启动服务:

$ docker compose up

该服务以简短的欢迎页面 http ://localhost:8080开始,并在http://localhost:8080/api/openapi-ui/index.html提供 Rest 界面。此 Rest-API 用户界面允许我们测试启动工作流或处理现有工作流的各种方法。


上传你的模型
首先我们需要上传我们的模型。为此,我们可以使用该curl命令并将我们的 BPMN 文件发布到 Rest Service 端点:

$ curl --user admin:adminadmin --request POST \
-Tmy-model.bpmn http://localhost:8080/api/model/bpmn

或者我们可以使用 Rest API UI 在资源上发布模型/api/model/bpmn/


可以从Github下载测试模型,
所有可用模型的状态都可以在 Rest API 端点进行验证:

http://localhost:8080/api/model

注意:我在这里使用用户 ID 'admin' 和密码 'adminadmin'。此服务定义了更多具有不同角色的用户。在此处查看详细信息。

启动新流程实例
现在,服务已启动并运行,我们可以启动第一个流程实例。为此,我们只需要发布包含模型信息和业务数据的 XML 文档。我们可以使用以下 Rest API 端点发布新的流程实例:

POST: /api/workflow/workitem

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <item name=
"$modelversion"><value xsi:type="xs:string">proposal-en-1.0</value></item>
    <item name=
"$taskid"><value xsi:type="xs:int">1000</value></item>
    <item name=
"$eventid"><value xsi:type="xs:int">10</value></item>
    <item name=
"subject">
        <value xsi:type=
"xs:string">My first propsal...</value>
    </item>
    <item name=
"amount">
        <value xsi:type=
"xs:double">500.0</value>
    </item>
</document>

再次,您可以直接使用 Rest-API UI 发布数据。在此示例中,我定义了模型版本、初始任务和要处理的事件,以及一些自定义业务数据(主题和金额)。

工作流引擎根据我们上传的 BPMN 模型自动执行数据并返回结果对象。为了验证结果,我们可以检查任务列表,其中包含用户“admin”在以下位置创建的所有流程实例:

http://localhost:8080/api/workflow/tasklist/creator/admin

如您所见,工作流引擎已处理我们的数据并将状态“已完成”应用于我们的新工作流实例。这是因为金额低于 1.000,00。为了测试我们的业务逻辑,我们现在可以将金额更改为大于 1.000,00 的值,这将根据我们的业务规则在状态“审核”中启动另一个新流程实例。

现在,我们可以轻松更改流程逻辑并添加新任务或业务规则。我们所要做的就是上传新版本的 BPMN 模型。无需重新部署应用程序。

要更新现有流程实例的数据,我们可以将数据与$uniqueid模型中的相应事件一起发布:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <item name=
"$uniqueid"><value xsi:type="xs:string">8333c61c-b973-4591-aabf-ec92bd59d74b</value></item>
    <item name=
"$eventid"><value xsi:type="xs:int">10</value></item>
    <item name=
"address">
        <value xsi:type=
"xs:string">Baker Street 221b.</value>
    </item>
</document>

该字段$uniqueid由第一次创建新工作流实例时返回,是进一步处理步骤的参考。在此示例中,我仅提供参考 ID、事件 ID 和一些新数据。工作流引擎将根据分配模型验证请求和事件。这可确保始终按照我们的业务流程处理数据!我们还可以使用$uniqueID从工作流引擎获取数据 - 例如在 Web 界面中显示数据。

如何将 BPMN 集成到您的应用程序中?
在本教程中,我故意省略了 Web 界面的设计,因为我想专注于业务逻辑。使用 Rest API(如本例所示)时,可以使用不同的前端技术轻松地将工作流引擎集成到应用程序中。此外,通常还有其他方法可以将 BPMN 引擎连接到您自己的应用程序,具体取决于引擎使用的框架。例如,许多开源引擎都基于 Java,可以通过 Maven 或 Gradle 等常见构建工具进行集成。

例如,您可以将 Imixs Workflow 引擎集成到 Jakarta EE 应用程序中,并具有以下依赖项:

...
    <dependency>
        <groupId>org.imixs.workflow</groupId>
        <artifactId>imixs-workflow-engine</artifactId>
        <version>${org.imixs.workflow.version}</version>
    </dependency>
    <dependency>
        <groupId>org.imixs.workflow</groupId>
        <artifactId>imixs-workflow-index-lucene</artifactId>
        <version>${org.imixs.workflow.version}</version>
    </dependency>
...

...并使用 CDI 框架在代码中调用引擎,如下所示:

@Inject
private org.imixs.workflow.engine.WorkflowService workflowService;

ItemCollection workitem=new ItemCollection().model("proposal-en-1.0").task(1000).event(10);
// assign some business data...
workitem.setItemValue(
"amount",500.0);
// process the workitem
workitem = workflowService.processWorkItem(workitem);

此代码示例等同于上面示例中的 Rest API 调用。

数据集成
如前所述,另一个方面是您处理业务数据的方式。在我的示例代码中,我将业务数据直接嵌入到工作流实例中,因此不需要外部数据库。

但当然在某些情况下,仅存储对外部数据集的引用并将业务数据保存在单独的数据库中可能会很有用。

或者您可以通过扩展数据模式来从数据处理应用程序中引用工作流实例。

在后两种情况下,我们还需要提供数据服务,以便能够在流程引擎中处理前面提到的业务逻辑。所有现代 BPMN 引擎都提供接口来连接数据源和流程逻辑。

结论
总之,将 BPMN 2.0 整合到您的业务应用程序中,可以提供一种结构化且高效的方式来处理您的业务流程。可视化处理模型的能力不仅简化了复杂工作流的设计和管理,而且还增强了技术和非技术团队之间的协作。通过使用 Open-BPMN 或 Imixs-Workflow 等工具,您可以轻松实施 BPMN 2.0 标准,确保您的业务应用程序既可扩展又具有适应性。采用 BPMN 2.0 可以带来更有组织、更透明、更有效的业务运营,为更大的成功和增长奠定基础。