.NET 使用Camunda快速入门

一.工作流介绍

1. 什么是工作流

工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。

工作流将一套大的业务逻辑分解成业务逻辑段, 并统一控制这些业务逻辑段的执行条件,执行顺序以及相互通信,实现业务逻辑的分解和解耦。

做饭:

贷款审批:

2. 为什么要使用工作流

在企业日常的管理中,经常会有出差申请、加班申请、请假申请等流程。

如果用人工的方式管理这些流程,效率低,管理成本高。

因此为了提高效率,我们需要使用到工作流开发。

3. 使用工作流有什么好处

在工作流开发中,我们可以通过每一个流程定义清楚的看到业务的所有步骤,以及每一个流程实例运行到什么位置,参与者是谁;

能够节省更多的时间成本,提升企业信息化水平。

二. 工作流引擎

1. Camunda介绍

Camunda是一种工作流引擎,是由Java开发的一个纯Java库。

工作流引擎是用来开发工作流的框架。

市面上主流的工作流引擎有Activiti、Flowable、Camunda等。

ActivitiActiviti 由 Alfresco 公司开发,目前最高版本为 Activiti cloud 7.1.0。由于团队分歧 ,在Activiti6版本衍生出了Flowable。 
FlowableFlowable是基于Activiti6衍生出来的版本,开发团队也是Activiti中分裂出来的,修复了Activiti6中的bug,并再此基础上实现的DMN、BPEL支持。 
CamundaCamunda是基于Activiti5的,最新版本是Camunda7.17,开发团队也是从Activiti中分裂出来的,发展轨迹和Flowable相似。通过压力测试验证Camunda BPMN引擎性能和稳定性更好,功能完善;除了BPMN,Camunda还支持CMMN(案例管理)和DMN(决策自动化)。Camunda不仅带有引擎,还有很多强大的工具,用于建模、任务管理、监控和用户管理等。 

Camunda BPM(业务流程管理)平台,用来管理,部署的流程定义、执行任务、策略等等。

下载安装一个Camunda平台,成功解压 Camunda 平台的发行版后,执行名为start.bat(对于 Windows 用户)或start.sh(对于 Unix 用户)的脚本。此脚本将启动应用程序服务器。

打开您的 Web 浏览器并导航到http://localhost:8080/以访问欢迎页面,Camunda的管理平台。

Camunda Modeler(用于编辑流程图及其他模型)平台,用来定义流程图,简单说就是一个画图工具。

下载 Modeler 后,只需将下载文件解压缩到您选择的文件夹中。

成功解压缩 zip 后,运行camunda-modeler.exe(对于 Windows 用户)、camunda-modeler.app(对于 Mac 用户)或camunda-modeler.sh(对于 Linux 用户)。  

2. Camunda常用Api

RepositoryService

该服务提供了管理和操控流程部署和流程定义的操作方法。

(1)查询流程引擎所知道的部署和流程定义。

(2)挂起、激活流程定义。挂起意味着不能进行下一步的操作,而激活则是反操作。

(3)获取各种资源,比如部署种包含的文件,或者引擎自动生成的流程图等。

RuntimeService

处理已经启动的流程实例,查询流程实例和执行。

TaskService

需要被用户或者系统执行的任务是流程引擎的核心,跟任务有关的资源都在这个服务中:

(1)查询分配给用户或组的任务。

(2)创建新的独立任务。

(3)控制将任务分配给那个用户,或者那些用户,以及以何种方式参与到任务中。 认领并完成一个任务。认领是指某个用户决定承担某个任务。 

FormService

获取表单相关的服务,可获取启动表单、审批表单,提交表单等操作。

HistoryService

获取执行的历史任务、历史的审批记录、参数、表单等信息。

三、学习步骤:

1、Camunda 官方快速入门教程中文版: https://zhuanlan.zhihu.com/p/375908620 或者 https://blog.csdn.net/zoollcar/article/details/117351192

   Camunda  Rest API 文档:  https://docs.camunda.org/rest/camunda-bpm-platform/7.19/

   Camunda 官网:   https://camunda.com/

2、使用Nuget包 Camunda.Worker GitHub 地址: https://github.com/AMalininHere/camunda-worker-dotnet 找里面的samples文件夹下的使用Demo代码

3、在VS2022上写一个Demo

3.1、创建一个.net6 web空模板服务,然后安装Nuget包 Camunda.Worker

1

<PackageReference Include="Camunda.Worker" Version="0.13.5" />

3.2、Program.cs改成如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

namespace CamundaDemoWeb

{

    public class Program

    {

        public static void Main(string[] args)

        {

            CreateHostBuilder(args).Build().Run();

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>

            Host.CreateDefaultBuilder(args)

                .ConfigureWebHostDefaults(webBuilder =>

                {

                    webBuilder.UseStartup<Startup>();

                });

    }

}

3.3、Startup.cs 注入Camunda 

using Camunda.Worker;
using Camunda.Worker.Client;
using CamundaDemoWeb.Handlers;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CamundaDemoWeb
{
    public class Startup
    {

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddExternalTaskClient(client =>
            {
                //client.BaseAddress = new Uri("http://localhost:8080/engine-rest");
                client.BaseAddress = new Uri("http://192.168.1.153:8080/engine-rest");
            });

            services.AddCamundaWorker("sampleWorker")
                .AddHandler<SayHelloHandler>()
                //.AddHandler<SayHelloGuestHandler>()
                .ConfigurePipeline(pipeline =>
                {
                    pipeline.Use(next => async context =>
                    {
                        var logger = context.ServiceProvider.GetRequiredService<ILogger<Startup>>();
                        logger.LogInformation("Started processing of task {Id}", context.Task.Id);
                        await next(context);
                        logger.LogInformation("Finished processing of task {Id}", context.Task.Id);
                    });
                });

            services.AddHealthChecks();
        }
      
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
}

3.4、写一个SayHelloHandler

using Camunda.Worker;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace CamundaDemoWeb.Handlers
{
    //[HandlerTopics("sayHello", LockDuration = 10_000)]
    //[HandlerVariables("USERNAME")]
    [HandlerTopics("charge-card", LockDuration = 5_000)]
    [HandlerVariables("amount")]
    public class SayHelloHandler : IExternalTaskHandler
    {
        public async Task<IExecutionResult> HandleAsync(ExternalTask externalTask, CancellationToken cancellationToken)
        {
            await Task.CompletedTask;
            //throw new System.NotImplementedException();
            var username = externalTask.Variables["amount"].Value;

            //await Task.Delay(1000);

            return new CompleteResult
            {
                Variables = new Dictionary<string, Variable>
                {
                    ["MESSAGE"] = Variable.String("Hello, Guest!")
                }
            };


            
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/274324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

48道Linux面试题

本博客将汇总 Linux 面试中常见的题目&#xff0c;并提供详细的解答。 文章目录 1、绝对路径用什么[符号表](https://so.csdn.net/so/search?q符号表&spm1001.2101.3001.7020)示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命…

GBASE南大通用 GCDW阿里云计算巢:自动化部署云原生数据仓库

目前&#xff0c;GBASE南大通用已与阿里云计算巢合作&#xff0c;双方融合各自技术优势&#xff0c;助力企业用户实现云上数据仓库的自动化部署&#xff0c;让用户在云端获取数据仓库服务“更简单”&#xff0c;让用户在云端使用数据仓库服务“更便捷”&#xff0c;满足企业用户…

数据挖掘(作业3

任务一 对以下数据集使用K均值聚类算法&#xff1a; 1&#xff09;观察实验结果是否符合预期&#xff1b; 2&#xff09;利用SSE标准确定K值&#xff1b; 3&#xff09;自行调参并观察对聚类结果的影响。 注意&#xff1a;需要把类别信息去掉。 “tutorial3_Data Explorat…

Oracle 12c rac 搭建 dg

环境 rac 环境 &#xff08;主&#xff09;byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;…

车路协同中 CUDA 鱼眼相机矫正、检测、追踪

在车路协同中,鱼眼一般用来补充杆件下方的盲区,需要实现目标检测、追踪、定位。在目标追踪任务中,通常的球机或者枪机方案,无法避免人群遮挡的问题,从而导致较高的ID Swich,造成追踪不稳定。但是鱼眼相机的顶视角安装方式,天然缓解了遮挡的问题,从而实现杆件下方的盲区…

关于“Python”的核心知识点整理大全46

目录 16.1.3 提取并读取数据 highs_lows.py highs_lows.py 16.1.4 绘制气温图表 highs_lows.py 16.1.5 模块 datetime ​编辑 16.1.6 在图表中添加日期 highs_lows.py 16.1.7 涵盖更长的时间 highs_lows.py highs_lows.py 16.1.9 给图表区域着色 highs_lows.py …

Linux操作系统(Crontab计划任务+NTP时间同步服务器)

如何修改linux系统时间 与时间相关的命令&#xff0c;查看当前的时间 运行 date 即可 cal 查看当前月份的日历 运行 timedatectl 查看时间详细参数 &#xff08; NTP&#xff1a; network time protocol 网络时间协议 &#xff09; &#xff08; local time : 本地时间 &#x…

搭建APP应用程序如何选择服务器

我经常收到许多关于如何搭建 APP 的询问。其中&#xff0c;如何选择服务器是许多初创企业和开发者经常面临的问题。带着这些问题我也通过一些科技手段收集整理了些知识&#xff0c;今天我就和大家来来探讨如何选择服务器&#xff0c;帮助您搭建一个稳定、高效、安全的 APP。 Ap…

MariaDB单机多实例的配置方法

1、什么是数据库的单机多实例 数据库的单机多实例是指在一台物理服务器上运行多个数据库实例。这种部署方式允许多个数据库实例共享相同的物理资源&#xff0c;如CPU、内存和存储&#xff0c;从而提高硬件利用率并降低成本。每个数据库实例可以独立运行&#xff0c;处理不同的…

python如何通过日志分析加入黑名单

python通过日志分析加入黑名单 监控nginx日志&#xff0c;若有人攻击&#xff0c;则加入黑名单&#xff0c;操作步骤如下&#xff1a; 1.读取日志文件 2.分隔文件&#xff0c;取出ip 3.将取出的ip放入list&#xff0c;然后判读ip的次数 4.若超过设定的次数&#xff0c;则加…

SwiftUI ArkUI 对比分析

下载链接&#x1f517;&#xff1a; https://download.csdn.net/download/gwh111/88670868 版本 1.0 (2023 年 4月) 更新说明&#xff1a; 4.7 修改问题和缺陷 4.13 新增缺陷讨论 4.14 新增引言和部分小结 4.17 高亮关键性代码&#xff0c;新增SwiftUI状态官方定义 目录 引言…

[Angular] 笔记 11:可观察对象(Observable)

chatgpt: 在 Angular 中&#xff0c;Observables 是用于处理异步数据流的重要工具。它们被广泛用于处理从异步操作中获取的数据&#xff0c;比如通过 HTTP 请求获取数据、定时器、用户输入等。Observables 提供了一种机制来订阅这些数据流&#xff0c;并可以在数据到达时执行相…

ElasticSearch:centos7安装elasticsearch7,kibana,ik中文分词器,云服务器安装elasticsearch

系统&#xff1a;centos7 elasticsearch: 7.17.16 安装目录&#xff1a;/usr/local 云服务器的安全组&#xff1a;开放 9200 和5601的端口 一、下载安装elasticsearch7.17.16 1、安装 #进入安装目录 cd /usr/local#下载elasticsearch wget https://artifacts.elastic.co/d…

ASP.NET Core 使用Log4Net写文本日志和数据库日志

1&#xff0c;先安装依赖 2&#xff0c;在项目目录新建Log4Net.config配置文件&#xff0c;必须要安装System.Data.SqlClient&#xff0c;不然日志存不进去数据库 <?xml version"1.0" encoding"utf-8"?> <log4net><!-- Define some outpu…

Redis6.0 Client-Side缓存是什么

前言 Redis在其6.0版本中加入了Client-side caching的支持&#xff0c;开启该功能后&#xff0c;Redis可以将指定的key-value缓存在客户端侧&#xff0c;这样当客户端发起请求时&#xff0c;如果客户端侧存在缓存&#xff0c;则无需请求Redis Server端。 Why Client-side Cac…

【C#】.net core 6.0 依赖注入生命周期

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 对于.net core而言&#xff0c;依赖注入生命周期有三种瞬态&#xff08;Transient&#xff09;、作用域&#xff08;Scoped&#xff09;和单例&#xff08;Singleton&#xff09;&#xf…

【正则表达式】

概述 正则表达式又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式并不仅限于某一种语…

传统船检已经过时?AR智慧船检来助力!!

想象一下&#xff0c;在茫茫大海中&#xff0c;一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜&#xff0c;他们不再需要反复翻阅厚重的手册&#xff0c;一切所需信息都实时显示在眼前。这不是科幻电影的场景&#xff0c;而是智慧船检技术带来的现实变革。那么问题…

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 JVM进程缓存Lua语法入…

scikit-learn文档中的数据生成器

目录 1. make_classification: 2. make_regression: 3. make_blobs: 4. make_moons: 5.make_circles 6. make_sparse_coded_signal: 1. make_classification: 这是一个用于生成复杂二维数据的函数&#xff0c;通常用于可视化分类器的学习过程或者测试机器学习算法的性能…